package org.xpect.ui.contentassist; import org.eclipse.xtext.RuleCall; import org.eclipse.xtext.nodemodel.ILeafNode; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor; import org.eclipse.xtext.ui.editor.contentassist.IContentProposalProvider; import org.eclipse.xtext.ui.editor.contentassist.RepeatedContentAssistProcessor.ModeAware; import org.xpect.registry.DefaultBinding; import org.xpect.services.XpectGrammarAccess; import org.xpect.ui.internal.XpectActivator; import org.xpect.ui.util.XpectFileAccess; import com.google.inject.Inject; import com.google.inject.Injector; public class XtProposalProvider implements IContentProposalProvider, ModeAware { private final Injector xpectInjector = XpectActivator.getInstance().getInjector(XpectActivator.ORG_XPECT_XPECT); @Inject @DefaultBinding private IContentProposalProvider dslDelegate; private IContentProposalProvider xpectDelegate = xpectInjector.getInstance(IContentProposalProvider.class); private ContentAssistContext.Factory xpectContextFactory = xpectInjector.getInstance(ContentAssistContext.Factory.class); private XpectGrammarAccess xpectGrammarAccess = xpectInjector.getInstance(XpectGrammarAccess.class); public void createProposals(ContentAssistContext context, ICompletionProposalAcceptor acceptor) { if (showXpectProposals(context)) { XtextResource xpectResource = XpectFileAccess.getXpectResource(context.getResource()); ContentAssistContext[] contexts = xpectContextFactory.create(context.getViewer(), context.getOffset(), xpectResource); boolean showDslProposals = false; for (ContentAssistContext xpectContext : contexts) if (acceptor.canAcceptMoreProposals()) { if (isXpectText(xpectContext)) showDslProposals = true; xpectDelegate.createProposals(xpectContext, acceptor); } if (showDslProposals && acceptor.canAcceptMoreProposals()) dslDelegate.createProposals(context, acceptor); } else { dslDelegate.createProposals(context, acceptor); } } protected boolean isXpectText(ContentAssistContext context) { INode node = context.getCurrentNode(); if (node == null || !(node.getGrammarElement() instanceof RuleCall)) return false; RuleCall rc = (RuleCall) node.getGrammarElement(); return rc.getRule() == xpectGrammarAccess.getANY_OTHERRule(); } protected boolean showXpectProposals(ContentAssistContext context) { if (!(context.getCurrentNode() instanceof ILeafNode)) return false; ILeafNode node = (ILeafNode) context.getCurrentNode(); if (!node.isHidden()) return false; String text = node.getText(); for (int i = 0; i < text.length(); i++) if (!Character.isWhitespace(text.charAt(i))) return true; return false; } public String getNextCategory() { if (dslDelegate instanceof ModeAware) return ((ModeAware) dslDelegate).getNextCategory(); return ""; } public boolean isLastMode() { if (dslDelegate instanceof ModeAware) return ((ModeAware) dslDelegate).isLastMode(); return true; } public void nextMode() { if (dslDelegate instanceof ModeAware) ((ModeAware) dslDelegate).nextMode(); } public void reset() { if (dslDelegate instanceof ModeAware) ((ModeAware) dslDelegate).reset(); } }