| author | szarnekow | 2009-04-27 09:39:46 (EDT) |
|---|---|---|
| committer | sefftinge | 2009-04-27 09:39:46 (EDT) |
| commit | 197e3c27a47afd38e0a77447aebd5067fd3d5b91 (patch) (side-by-side diff) | |
| tree | 4c23e685d786b305ded02481f37da9d07f02c27c | |
| parent | 3fa105f303088979491f547d00612c38836436e7 (diff) | |
| download | org.eclipse.xtext-197e3c27a47afd38e0a77447aebd5067fd3d5b91.zip org.eclipse.xtext-197e3c27a47afd38e0a77447aebd5067fd3d5b91.tar.gz org.eclipse.xtext-197e3c27a47afd38e0a77447aebd5067fd3d5b91.tar.bz2 | |
Fix: ContentAssist between two elements (https://bugs.eclipse.org/bugs/show_bug.cgi?id=260718)
59 files changed, 1095 insertions, 449 deletions
diff --git a/devtools/org.eclipse.xtext.reference.ui/src-gen/org/eclipse/xtext/reference/AbstractReferenceGrammarUiModule.java b/devtools/org.eclipse.xtext.reference.ui/src-gen/org/eclipse/xtext/reference/AbstractReferenceGrammarUiModule.java index e4d7c17..ee7bc7a 100644 --- a/devtools/org.eclipse.xtext.reference.ui/src-gen/org/eclipse/xtext/reference/AbstractReferenceGrammarUiModule.java +++ b/devtools/org.eclipse.xtext.reference.ui/src-gen/org/eclipse/xtext/reference/AbstractReferenceGrammarUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractReferenceGrammarUiModule extends DefaultUIModule { } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.reference.ReferenceGrammarProposalProvider.class; } diff --git a/examples/org.eclipse.xtext.example.domainmodel.ui/src-gen/org/eclipse/xtext/example/AbstractDomainmodelUiModule.java b/examples/org.eclipse.xtext.example.domainmodel.ui/src-gen/org/eclipse/xtext/example/AbstractDomainmodelUiModule.java index 170018a..c7b60fd 100644 --- a/examples/org.eclipse.xtext.example.domainmodel.ui/src-gen/org/eclipse/xtext/example/AbstractDomainmodelUiModule.java +++ b/examples/org.eclipse.xtext.example.domainmodel.ui/src-gen/org/eclipse/xtext/example/AbstractDomainmodelUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractDomainmodelUiModule extends DefaultUIModule { } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.example.DomainmodelProposalProvider.class; } diff --git a/examples/org.eclipse.xtext.example.ecoredsl.ui/plugin.xml b/examples/org.eclipse.xtext.example.ecoredsl.ui/plugin.xml index 4009697..21e5472 100644 --- a/examples/org.eclipse.xtext.example.ecoredsl.ui/plugin.xml +++ b/examples/org.eclipse.xtext.example.ecoredsl.ui/plugin.xml @@ -82,23 +82,23 @@ <extension point="org.eclipse.ui.editors.templates"> <contextType name="EPackageDecl" - class="org.eclipse.xtext.ui.common.editor.contentassist.impl.XtextTemplateContextType" + class="org.eclipse.xtext.ui.common.editor.contentassist.XtextTemplateContextType" id="org.eclipse.xtext.ecoredsl.ui.templates.contextType.EPackageDecl"> </contextType> <contextType name="EClassDecl" - class="org.eclipse.xtext.ui.common.editor.contentassist.impl.XtextTemplateContextType" + class="org.eclipse.xtext.ui.common.editor.contentassist.XtextTemplateContextType" id="org.eclipse.xtext.ecoredsl.ui.templates.contextType.EClassDecl"> </contextType> <contextType name="EDataTypeDecl" - class="org.eclipse.xtext.ui.common.editor.contentassist.impl.XtextTemplateContextType" + class="org.eclipse.xtext.ui.common.editor.contentassist.XtextTemplateContextType" id="org.eclipse.xtext.ecoredsl.ui.templates.contextType.EDataTypeDecl"> </contextType> <contextType name="EEnumDecl" - class="org.eclipse.xtext.ui.common.editor.contentassist.impl.XtextTemplateContextType" + class="org.eclipse.xtext.ui.common.editor.contentassist.XtextTemplateContextType" id="org.eclipse.xtext.ecoredsl.ui.templates.contextType.EEnumDecl"> </contextType> <contextType name="EAttributeDecl" - class="org.eclipse.xtext.ui.common.editor.contentassist.impl.XtextTemplateContextType" + class="org.eclipse.xtext.ui.common.editor.contentassist.XtextTemplateContextType" id="org.eclipse.xtext.ecoredsl.ui.templates.contextType.EAttributeDecl"> </contextType> <include file="templates/templates.xml" /> diff --git a/examples/org.eclipse.xtext.example.ecoredsl.ui/src-gen/org/eclipse/xtext/example/AbstractEcoreDslUiModule.java b/examples/org.eclipse.xtext.example.ecoredsl.ui/src-gen/org/eclipse/xtext/example/AbstractEcoreDslUiModule.java index 103a839..b36cf1d5 100644 --- a/examples/org.eclipse.xtext.example.ecoredsl.ui/src-gen/org/eclipse/xtext/example/AbstractEcoreDslUiModule.java +++ b/examples/org.eclipse.xtext.example.ecoredsl.ui/src-gen/org/eclipse/xtext/example/AbstractEcoreDslUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractEcoreDslUiModule extends DefaultUIModule { } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.example.EcoreDslProposalProvider.class; } diff --git a/examples/org.eclipse.xtext.example.ecoredsl.ui/src/org/eclipse/xtext/example/EcoreDslTemplateProposalProvider.java b/examples/org.eclipse.xtext.example.ecoredsl.ui/src/org/eclipse/xtext/example/EcoreDslTemplateProposalProvider.java index aea3f2f..54e43a8 100644 --- a/examples/org.eclipse.xtext.example.ecoredsl.ui/src/org/eclipse/xtext/example/EcoreDslTemplateProposalProvider.java +++ b/examples/org.eclipse.xtext.example.ecoredsl.ui/src/org/eclipse/xtext/example/EcoreDslTemplateProposalProvider.java @@ -12,7 +12,7 @@ import org.eclipse.jface.text.templates.TemplateContextType; import org.eclipse.xtext.Assignment; import org.eclipse.xtext.Keyword; import org.eclipse.xtext.RuleCall; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.DefaultTemplateProposalProvider; +import org.eclipse.xtext.ui.common.editor.contentassist.DefaultTemplateProposalProvider; import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; /** diff --git a/examples/org.eclipse.xtext.example.fowlerdsl.ui/src-gen/org/eclipse/xtext/example/AbstractFowlerDslUiModule.java b/examples/org.eclipse.xtext.example.fowlerdsl.ui/src-gen/org/eclipse/xtext/example/AbstractFowlerDslUiModule.java index a57708b..e303947 100644 --- a/examples/org.eclipse.xtext.example.fowlerdsl.ui/src-gen/org/eclipse/xtext/example/AbstractFowlerDslUiModule.java +++ b/examples/org.eclipse.xtext.example.fowlerdsl.ui/src-gen/org/eclipse/xtext/example/AbstractFowlerDslUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractFowlerDslUiModule extends DefaultUIModule { } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.example.FowlerDslProposalProvider.class; } diff --git a/examples/org.eclipse.xtext.example.fowlerdsl.ui/src/org/eclipse/xtext/example/FowlerDslTemplateProposalProvider.java b/examples/org.eclipse.xtext.example.fowlerdsl.ui/src/org/eclipse/xtext/example/FowlerDslTemplateProposalProvider.java index 04d7e31..ede0736 100644 --- a/examples/org.eclipse.xtext.example.fowlerdsl.ui/src/org/eclipse/xtext/example/FowlerDslTemplateProposalProvider.java +++ b/examples/org.eclipse.xtext.example.fowlerdsl.ui/src/org/eclipse/xtext/example/FowlerDslTemplateProposalProvider.java @@ -11,7 +11,7 @@ import org.eclipse.jface.text.templates.Template; import org.eclipse.jface.text.templates.TemplateContextType; import org.eclipse.xtext.Keyword; import org.eclipse.xtext.RuleCall; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.DefaultTemplateProposalProvider; +import org.eclipse.xtext.ui.common.editor.contentassist.DefaultTemplateProposalProvider; import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; /** diff --git a/plugins/org.eclipse.xtext.ui.common/META-INF/MANIFEST.MF b/plugins/org.eclipse.xtext.ui.common/META-INF/MANIFEST.MF index dc3e557..7c56ee0 100644 --- a/plugins/org.eclipse.xtext.ui.common/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.xtext.ui.common/META-INF/MANIFEST.MF @@ -8,7 +8,8 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.5 Require-Bundle: org.eclipse.xtext.ui.core,
org.eclipse.xtext.log4j;bundle-version="1.2.15",
org.eclipse.ui.ide;bundle-version="3.4.0"
-Export-Package: org.eclipse.xtext.ui.common.editor.contentassist.impl,
+Export-Package: org.eclipse.xtext.ui.common.editor.contentassist,
+ org.eclipse.xtext.ui.common.editor.contentassist.antlr,
org.eclipse.xtext.ui.common.editor.folding,
org.eclipse.xtext.ui.common.editor.formatting,
org.eclipse.xtext.ui.common.editor.hover,
diff --git a/plugins/org.eclipse.xtext.ui.common/src-gen/org/eclipse/xtext/common/AbstractTerminalsProposalProvider.java b/plugins/org.eclipse.xtext.ui.common/src-gen/org/eclipse/xtext/common/AbstractTerminalsProposalProvider.java index 266bd5c..e0018c5 100644 --- a/plugins/org.eclipse.xtext.ui.common/src-gen/org/eclipse/xtext/common/AbstractTerminalsProposalProvider.java +++ b/plugins/org.eclipse.xtext.ui.common/src-gen/org/eclipse/xtext/common/AbstractTerminalsProposalProvider.java @@ -9,7 +9,7 @@ import org.eclipse.xtext.Alternatives; import org.eclipse.xtext.Assignment; import org.eclipse.xtext.CrossReference; import org.eclipse.xtext.RuleCall; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.AbstractJavaBasedContentProposalProvider; +import org.eclipse.xtext.ui.common.editor.contentassist.AbstractJavaBasedContentProposalProvider; import org.eclipse.xtext.ui.core.editor.contentassist.ICompletionProposalAcceptor; import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/common/TerminalsProposalProvider.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/common/TerminalsProposalProvider.java index 7bf1cc6..8b0d4a3 100644 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/common/TerminalsProposalProvider.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/common/TerminalsProposalProvider.java @@ -5,41 +5,52 @@ import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.xtext.Assignment; import org.eclipse.xtext.GrammarUtil; import org.eclipse.xtext.RuleCall; -import org.eclipse.xtext.conversion.IValueConverterService; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.ConfigurableCompletionProposal; +import org.eclipse.xtext.ui.common.editor.contentassist.ConfigurableCompletionProposal; import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.core.editor.contentassist.ICompletionProposalAcceptor; +import org.eclipse.xtext.ui.core.editor.contentassist.PrefixMatcher; import org.eclipse.xtext.util.Strings; -import com.google.inject.Inject; - /** * @author Sebastian Zarnekow - Initial contribution and API */ public class TerminalsProposalProvider extends org.eclipse.xtext.common.AbstractTerminalsProposalProvider { - @Inject - private IValueConverterService valueConverter; - @Override public void complete_ID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { if (doCreateIdProposals()) { - String feature = getAssignedFeature(ruleCall); - String proposalText = feature != null ? feature : Strings.toFirstUpper(ruleCall.getRule().getName().toLowerCase()); - String displayText = proposalText; - if (feature != null) - displayText = proposalText + " - " + ruleCall.getRule().getName(); - proposalText = valueConverter.toString(proposalText, ruleCall.getRule().getName()); - ICompletionProposal proposal = createCompletionProposal(proposalText, displayText, null, context); - if (proposal instanceof ConfigurableCompletionProposal) { - ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal; - configurable.setSelectionStart(configurable.getReplacementOffset()); - configurable.setSelectionLength(proposalText.length()); - configurable.setAutoInsertable(false); - configurable.setSimpleLinkedMode(context.getViewer(), '\t', ' '); + final PrefixMatcher oldMatcher = context.getMatcher(); + try { + PrefixMatcher newMatcher = new PrefixMatcher() { + @Override + public boolean isCandidateMatchingPrefix(String name, String prefix) { + String strippedName = name; + if (name.startsWith("^") && !prefix.startsWith("^")) { + strippedName = name.substring(1); + } + return oldMatcher.isCandidateMatchingPrefix(strippedName, prefix); + } + }; + context.setMatcher(newMatcher); + String feature = getAssignedFeature(ruleCall); + String proposalText = feature != null ? feature : Strings.toFirstUpper(ruleCall.getRule().getName().toLowerCase()); + String displayText = proposalText; + if (feature != null) + displayText = proposalText + " - " + ruleCall.getRule().getName(); + proposalText = getValueConverter().toString(proposalText, ruleCall.getRule().getName()); + ICompletionProposal proposal = createCompletionProposal(proposalText, displayText, null, context); + if (proposal instanceof ConfigurableCompletionProposal) { + ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal; + configurable.setSelectionStart(configurable.getReplacementOffset()); + configurable.setSelectionLength(proposalText.length()); + configurable.setAutoInsertable(false); + configurable.setSimpleLinkedMode(context.getViewer(), '\t', ' '); + } + acceptor.accept(proposal); + } finally { + context.setMatcher(oldMatcher); } - acceptor.accept(proposal); } } @@ -66,7 +77,7 @@ public class TerminalsProposalProvider extends org.eclipse.xtext.common.Abstract private void createStringProposal(ContentAssistContext context, ICompletionProposalAcceptor acceptor, String feature, RuleCall ruleCall) { String proposalText = feature != null ? feature : Strings.toFirstUpper(ruleCall.getRule().getName().toLowerCase()); - proposalText = valueConverter.toString(proposalText, ruleCall.getRule().getName()); + proposalText = getValueConverter().toString(proposalText, ruleCall.getRule().getName()); String displayText = proposalText; if (feature != null) displayText = displayText + " - " + ruleCall.getRule().getName(); @@ -112,7 +123,7 @@ public class TerminalsProposalProvider extends org.eclipse.xtext.common.Abstract private void createIntProposal(ContentAssistContext context, ICompletionProposalAcceptor acceptor, RuleCall ruleCall, String feature, int i) { - String proposalText = valueConverter.toString(i, ruleCall.getRule().getName()); + String proposalText = getValueConverter().toString(i, ruleCall.getRule().getName()); String displayText = proposalText + " - " + ruleCall.getRule().getName(); if (feature != null) displayText = proposalText + " - " + feature; @@ -127,11 +138,4 @@ public class TerminalsProposalProvider extends org.eclipse.xtext.common.Abstract acceptor.accept(proposal); } - public void setValueConverter(IValueConverterService valueConverter) { - this.valueConverter = valueConverter; - } - - public IValueConverterService getValueConverter() { - return valueConverter; - } } diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractJavaBasedContentProposalProvider.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/AbstractContentProposalProvider.java index 2ed1176..f69949e 100755 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractJavaBasedContentProposalProvider.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/AbstractContentProposalProvider.java @@ -5,88 +5,159 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import org.apache.log4j.Logger; -import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EReference; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.graphics.Image; -import org.eclipse.xtext.AbstractRule; +import org.eclipse.xtext.AbstractElement; import org.eclipse.xtext.Assignment; -import org.eclipse.xtext.CrossReference; -import org.eclipse.xtext.GrammarUtil; import org.eclipse.xtext.Keyword; -import org.eclipse.xtext.ParserRule; import org.eclipse.xtext.RuleCall; -import org.eclipse.xtext.crossref.IScope; -import org.eclipse.xtext.crossref.IScopeProvider; +import org.eclipse.xtext.conversion.IValueConverterService; import org.eclipse.xtext.crossref.IScopedElement; import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.core.editor.contentassist.ICompletionProposalAcceptor; -import org.eclipse.xtext.util.PolymorphicDispatcher; -import org.eclipse.xtext.util.Strings; -import org.eclipse.xtext.util.PolymorphicDispatcher.ErrorHandler; -import org.eclipse.xtext.util.PolymorphicDispatcher.NullErrorHandler; +import org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider; +import org.eclipse.xtext.util.XtextSwitch; +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.inject.Inject; /** + * The default implementation of interface {@link IContentProposalProvider} provided with Xtext. + * * @author Michael Clay - Initial contribution and API - * @author Jan Köhnlein - Initial contribution and API * @author Sebastian Zarnekow - Initial contribution and API + * @author Heiko Behrens + * @author Jan Köhnlein */ -public abstract class AbstractJavaBasedContentProposalProvider extends AbstractContentProposalProvider { - - protected final static Logger logger = Logger.getLogger(AbstractJavaBasedContentProposalProvider.class); - - @Inject - protected IScopeProvider scopeProvider; - +public abstract class AbstractContentProposalProvider implements IContentProposalProvider { + + public class DefaultContentAssistProcessorSwitch extends XtextSwitch<Boolean> { + + private final ContentAssistContext context; + private final ICompletionProposalAcceptor acceptor; + + public DefaultContentAssistProcessorSwitch(ContentAssistContext context, ICompletionProposalAcceptor acceptor) { + this.context = context; + this.acceptor = acceptor; + } + + @Override + public Boolean defaultCase(EObject object) { + return Boolean.TRUE; + } + + @Override + public Boolean caseKeyword(Keyword object) { + completeKeyword(object, context, acceptor); + return Boolean.TRUE; + } + + @Override + public Boolean caseRuleCall(RuleCall object) { + completeRuleCall(object, context, acceptor); + return Boolean.TRUE; + } + + @Override + public Boolean caseAssignment(Assignment object) { + completeAssignment(object, context, acceptor); + return Boolean.TRUE; + } + } + @Inject protected ILabelProvider labelProvider; - private final Map<String, PolymorphicDispatcher<Void>> dispatchers; + @Inject + private IValueConverterService valueConverter; - protected AbstractJavaBasedContentProposalProvider() { - dispatchers = new HashMap<String, PolymorphicDispatcher<Void>>(); - } + @Inject + private IProposalConflictHelper conflictHelper; - @Override - public void completeKeyword(Keyword keyword, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { - if (logger.isDebugEnabled()) { - logger.debug("completeKeyword '" + keyword.getValue()+ "' for model '" + contentAssistContext.getCurrentModel() - + "' and prefix '"+ contentAssistContext.getPrefix() + "'"); + public static class NullSafeCompletionProposalAcceptor extends ICompletionProposalAcceptor.Delegate { + + public NullSafeCompletionProposalAcceptor(ICompletionProposalAcceptor delegate) { + super(); + setDelegate(delegate); + } + + @Override + public void accept(ICompletionProposal proposal) { + if (proposal != null) + super.accept(proposal); } - acceptor.accept(createCompletionProposal(keyword, keyword.getValue(), contentAssistContext)); } - @Override - public void completeRuleCall(RuleCall ruleCall, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { - if (logger.isDebugEnabled()) { - logger.debug("completeRuleCall '"+ ruleCall.getRule().getName()+ "' cardinality '" - + ruleCall.getCardinality()+ "' for model '"+ contentAssistContext.getCurrentModel() - + "' and prefix '"+ contentAssistContext.getPrefix() + "'"); + public void createProposals(ContentAssistContext context, ICompletionProposalAcceptor acceptor) { + ICompletionProposalAcceptor nullSafe = new NullSafeCompletionProposalAcceptor(acceptor); + DefaultContentAssistProcessorSwitch selector = new DefaultContentAssistProcessorSwitch(context, nullSafe); + for (AbstractElement element : context.getFirstSetGrammarElements()) { + selector.doSwitch(element); } - AbstractRule calledRule = ruleCall.getRule(); - String methodName = "complete_"+ calledRule.getName(); - invokeMethod(methodName, acceptor, contentAssistContext.getCurrentModel(), ruleCall, contentAssistContext); } - @Override - public void completeAssignment(Assignment assignment, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { - ParserRule parserRule = GrammarUtil.containingParserRule(assignment); - String methodName = "complete"+ Strings.toFirstUpper(parserRule.getName()) + "_"+ - Strings.toFirstUpper(assignment.getFeature()); - invokeMethod(methodName, acceptor, contentAssistContext.getCurrentModel(), assignment, contentAssistContext); + public abstract void completeKeyword(Keyword object, ContentAssistContext context, + ICompletionProposalAcceptor acceptor); + + public abstract void completeRuleCall(RuleCall object, ContentAssistContext context, + ICompletionProposalAcceptor acceptor); + + public abstract void completeAssignment(Assignment object, ContentAssistContext context, + ICompletionProposalAcceptor acceptor); + + public DefaultContentAssistProcessorSwitch createSelector(ContentAssistContext context, + ICompletionProposalAcceptor acceptor) { + return new DefaultContentAssistProcessorSwitch(context, acceptor); } + public static class FilteringCompletionProposalAcceptor extends ICompletionProposalAcceptor.Delegate { + + private final Predicate<ICompletionProposal> filter; + + public FilteringCompletionProposalAcceptor(ICompletionProposalAcceptor delegate, Predicate<ICompletionProposal> filter) { + super(); + this.filter = filter; + setDelegate(delegate); + } + + @Override + public void accept(ICompletionProposal proposal) { + if (filter.apply(proposal)) + super.accept(proposal); + } + + } + + public static class ModifyingCompletionProposalAcceptor extends ICompletionProposalAcceptor.Delegate { + private final Function<ICompletionProposal, ICompletionProposal> modifier; + + public ModifyingCompletionProposalAcceptor(ICompletionProposalAcceptor delegate, Function<ICompletionProposal, ICompletionProposal> modifier) { + super(); + this.modifier = modifier; + setDelegate(delegate); + } + + @Override + public void accept(ICompletionProposal proposal) { + if (proposal != null) + super.accept(modifier.apply(proposal)); + } + } + + public ICompletionProposalAcceptor filter(ICompletionProposalAcceptor acceptor, Predicate<ICompletionProposal> filter) { + return new FilteringCompletionProposalAcceptor(acceptor, Predicates.and(Predicates.notNull(), filter)); + } + + public ICompletionProposalAcceptor modify(ICompletionProposalAcceptor acceptor, Function<ICompletionProposal, ICompletionProposal> modifier) { + return new ModifyingCompletionProposalAcceptor(acceptor, modifier); + } + /** * @see #createCompletionProposal(AbstractElement, String, IContentAssistContext, Image) */ @@ -166,13 +237,21 @@ public abstract class AbstractJavaBasedContentProposalProvider extends AbstractC return createCompletionProposal(name, displayString, image, replacementOffset, replacementLength, prefix, context); } - protected ICompletionProposal createCompletionProposal(String name, String displayString, Image image, + protected ICompletionProposal createCompletionProposal(String proposal, String displayString, Image image, int replacementOffset, int replacementLength, String prefix, ContentAssistContext context) { - if (context.getMatcher().isCandidateMatchingPrefix(name, prefix)) - return doCreateProposal(name, displayString, image, replacementOffset, replacementLength, context); + if (isValidProposal(proposal, prefix, context)) + return doCreateProposal(proposal, displayString, image, replacementOffset, replacementLength, context); return null; } + protected boolean isValidProposal(String proposal, String prefix, ContentAssistContext context) { + if (!context.getMatcher().isCandidateMatchingPrefix(proposal, prefix)) + return false; + if (conflictHelper.existsConflict(proposal, context)) + return false; + return true; + } + protected ConfigurableCompletionProposal doCreateProposal(String name, String displayString, Image image, int replacementOffset, int replacementLength, ContentAssistContext context) { ConfigurableCompletionProposal result = new ConfigurableCompletionProposal(name, replacementOffset, replacementLength, name.length(), image, displayString, null, null); @@ -181,30 +260,12 @@ public abstract class AbstractJavaBasedContentProposalProvider extends AbstractC return result; } - /** - * Concrete subclasses can override this to provide custom lookup behavior - * for <code>CrossReference</code>. This implementation delegates to the - * injected LinkingService - * - * @return a list of <code>ICompletionProposal</code> matching the given - * assignment - */ - protected void lookupCrossReference(CrossReference crossReference, ContentAssistContext contentAssistContext, - ICompletionProposalAcceptor acceptor) { - if (scopeProvider != null) { - ParserRule containingParserRule = GrammarUtil.containingParserRule(crossReference); - if (!GrammarUtil.isDatatypeRule(containingParserRule)) { - EClass eClass = (EClass) containingParserRule.getType().getClassifier(); - EReference ref = GrammarUtil.getReference(crossReference, eClass); - IScope scope = scopeProvider.getScope(contentAssistContext.getCurrentModel(), ref); - Iterable<IScopedElement> candidates = scope.getAllContents(); - for (IScopedElement candidate: candidates) { - if (!acceptor.canAcceptMoreProposals()) - return; - acceptor.accept(createCompletionProposal(candidate, contentAssistContext)); - } - } - } + public void setValueConverter(IValueConverterService valueConverter) { + this.valueConverter = valueConverter; + } + + public IValueConverterService getValueConverter() { + return valueConverter; } /** @@ -216,25 +277,12 @@ public abstract class AbstractJavaBasedContentProposalProvider extends AbstractC protected Image getImage(EObject eObject) { return labelProvider.getImage(eObject); } - - protected void invokeMethod(String methodName, ICompletionProposalAcceptor acceptor, Object... params) { - PolymorphicDispatcher<Void> dispatcher = dispatchers.get(methodName); - if (dispatcher == null) { - ErrorHandler<Void> errorHandler = NullErrorHandler.get(); - dispatcher = new PolymorphicDispatcher<Void>(methodName, params.length + 1, params.length + 1, Collections.singletonList(this), errorHandler) { - @Override - public Class<?> getDefaultClass(int paramIndex) { - if (paramIndex == 0) - return EObject.class; - return super.getDefaultClass(paramIndex); - } - }; - dispatchers.put(methodName, dispatcher); - } - Object[] paramAsArray = new Object[params.length + 1]; - System.arraycopy(params, 0, paramAsArray, 0, params.length); - paramAsArray[params.length] = acceptor; - dispatcher.invoke(paramAsArray); + + public void setConflictHelper(IProposalConflictHelper conflictHelper) { + this.conflictHelper = conflictHelper; } + public IProposalConflictHelper getConflictHelper() { + return conflictHelper; + } } diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/AbstractJavaBasedContentProposalProvider.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/AbstractJavaBasedContentProposalProvider.java new file mode 100755 index 0000000..edcaa4b --- a/dev/null +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/AbstractJavaBasedContentProposalProvider.java @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.ui.common.editor.contentassist; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.xtext.AbstractRule; +import org.eclipse.xtext.Assignment; +import org.eclipse.xtext.CrossReference; +import org.eclipse.xtext.GrammarUtil; +import org.eclipse.xtext.Keyword; +import org.eclipse.xtext.ParserRule; +import org.eclipse.xtext.RuleCall; +import org.eclipse.xtext.crossref.IScope; +import org.eclipse.xtext.crossref.IScopeProvider; +import org.eclipse.xtext.crossref.IScopedElement; +import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; +import org.eclipse.xtext.ui.core.editor.contentassist.ICompletionProposalAcceptor; +import org.eclipse.xtext.util.PolymorphicDispatcher; +import org.eclipse.xtext.util.Strings; +import org.eclipse.xtext.util.PolymorphicDispatcher.ErrorHandler; +import org.eclipse.xtext.util.PolymorphicDispatcher.NullErrorHandler; + +import com.google.inject.Inject; + +/** + * @author Michael Clay - Initial contribution and API + * @author Jan Köhnlein - Initial contribution and API + * @author Sebastian Zarnekow - Initial contribution and API + */ +public abstract class AbstractJavaBasedContentProposalProvider extends AbstractContentProposalProvider { + + private final static Logger logger = Logger.getLogger(AbstractJavaBasedContentProposalProvider.class); + + @Inject + protected IScopeProvider scopeProvider; + + private final Map<String, PolymorphicDispatcher<Void>> dispatchers; + + protected AbstractJavaBasedContentProposalProvider() { + dispatchers = new HashMap<String, PolymorphicDispatcher<Void>>(); + } + + @Override + public void completeKeyword(Keyword keyword, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { + if (logger.isDebugEnabled()) { + logger.debug("completeKeyword '" + keyword.getValue()+ "' for model '" + contentAssistContext.getCurrentModel() + + "' and prefix '"+ contentAssistContext.getPrefix() + "'"); + } + acceptor.accept(createCompletionProposal(keyword, keyword.getValue(), contentAssistContext)); + } + + @Override + public void completeRuleCall(RuleCall ruleCall, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { + if (logger.isDebugEnabled()) { + logger.debug("completeRuleCall '"+ ruleCall.getRule().getName()+ "' cardinality '" + + ruleCall.getCardinality()+ "' for model '"+ contentAssistContext.getCurrentModel() + + "' and prefix '"+ contentAssistContext.getPrefix() + "'"); + } + AbstractRule calledRule = ruleCall.getRule(); + String methodName = "complete_"+ calledRule.getName(); + invokeMethod(methodName, acceptor, contentAssistContext.getCurrentModel(), ruleCall, contentAssistContext); + } + + @Override + public void completeAssignment(Assignment assignment, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) { + ParserRule parserRule = GrammarUtil.containingParserRule(assignment); + String methodName = "complete"+ Strings.toFirstUpper(parserRule.getName()) + "_"+ + Strings.toFirstUpper(assignment.getFeature()); + invokeMethod(methodName, acceptor, contentAssistContext.getCurrentModel(), assignment, contentAssistContext); + } + + /** + * Concrete subclasses can override this to provide custom lookup behavior + * for <code>CrossReference</code>. This implementation delegates to the + * injected LinkingService + * + * @return a list of <code>ICompletionProposal</code> matching the given + * assignment + */ + protected void lookupCrossReference(CrossReference crossReference, ContentAssistContext contentAssistContext, + ICompletionProposalAcceptor acceptor) { + if (scopeProvider != null) { + ParserRule containingParserRule = GrammarUtil.containingParserRule(crossReference); + if (!GrammarUtil.isDatatypeRule(containingParserRule)) { + EClass eClass = (EClass) containingParserRule.getType().getClassifier(); + EReference ref = GrammarUtil.getReference(crossReference, eClass); + IScope scope = scopeProvider.getScope(contentAssistContext.getCurrentModel(), ref); + Iterable<IScopedElement> candidates = scope.getAllContents(); + for (IScopedElement candidate: candidates) { + if (!acceptor.canAcceptMoreProposals()) + return; + if (crossReference.getTerminal() instanceof RuleCall) { + String ruleName = ((RuleCall) crossReference.getTerminal()).getRule().getName(); + String proposal = getValueConverter().toString(candidate.name(), ruleName); + acceptor.accept(createCompletionProposal(candidate.element(), proposal, candidate.name(), contentAssistContext)); + } else { + acceptor.accept(createCompletionProposal(candidate, contentAssistContext)); + } + } + } + } + } + + protected void invokeMethod(String methodName, ICompletionProposalAcceptor acceptor, Object... params) { + PolymorphicDispatcher<Void> dispatcher = dispatchers.get(methodName); + if (dispatcher == null) { + ErrorHandler<Void> errorHandler = NullErrorHandler.get(); + dispatcher = new PolymorphicDispatcher<Void>(methodName, params.length + 1, params.length + 1, Collections.singletonList(this), errorHandler) { + @Override + public Class<?> getDefaultClass(int paramIndex) { + if (paramIndex == 0) + return EObject.class; + return super.getDefaultClass(paramIndex); + } + }; + dispatchers.put(methodName, dispatcher); + } + Object[] paramAsArray = new Object[params.length + 1]; + System.arraycopy(params, 0, paramAsArray, 0, params.length); + paramAsArray[params.length] = acceptor; + dispatcher.invoke(paramAsArray); + } + +} diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractTemplateProposalProvider.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/AbstractTemplateProposalProvider.java index b02810a..7528c1e 100755 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractTemplateProposalProvider.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/AbstractTemplateProposalProvider.java @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.templates.Template; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/ConfigurableCompletionProposal.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/ConfigurableCompletionProposal.java index cc2a970..48264a4 100644 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/ConfigurableCompletionProposal.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/ConfigurableCompletionProposal.java @@ -5,7 +5,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import org.apache.log4j.Logger; import org.eclipse.core.runtime.Assert; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/CrossReferenceTemplateVariableResolver.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/CrossReferenceTemplateVariableResolver.java index 09f2554..5697944 100644 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/CrossReferenceTemplateVariableResolver.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/CrossReferenceTemplateVariableResolver.java @@ -5,7 +5,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import java.util.ArrayList; import java.util.List; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultCompletionProposalPostProcessor.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultCompletionProposalPostProcessor.java index 1bf998c..1ae79c1 100644 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultCompletionProposalPostProcessor.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultCompletionProposalPostProcessor.java @@ -5,7 +5,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.xtext.ui.core.editor.contentassist.ICompletionProposalPostProcessor; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultContentAssistContextFactory.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultContentAssistContextFactory.java index b7b9dd9..b554d4a 100755 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultContentAssistContextFactory.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultContentAssistContextFactory.java @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import java.util.ArrayList; import java.util.Iterator; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultContentAssistantFactory.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultContentAssistantFactory.java index 63ac1ab..c8db99b 100644 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultContentAssistantFactory.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultContentAssistantFactory.java @@ -5,7 +5,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.contentassist.ContentAssistant; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultFollowElementCalculator.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultFollowElementCalculator.java index 7586df0..a87dfa3 100644 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultFollowElementCalculator.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultFollowElementCalculator.java @@ -5,7 +5,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import java.util.Set; @@ -59,9 +59,9 @@ public class DefaultFollowElementCalculator implements IFollowElementCalculator this.decorated = decorated; } - public void accept(AbstractElement element, SetKind kind) { + public void accept(AbstractElement element) { if (element != null) - decorated.accept(element, kind); + decorated.accept(element); } } @@ -85,7 +85,7 @@ public class DefaultFollowElementCalculator implements IFollowElementCalculator @Override public ElementSwitch caseEnumLiteralDeclaration(EnumLiteralDeclaration object) { doSwitch(object.getLiteral()); - acceptor.accept(object, SetKind.FirstSet); + acceptor.accept(object); return this; } @@ -101,7 +101,7 @@ public class DefaultFollowElementCalculator implements IFollowElementCalculator @Override public ElementSwitch caseAssignment(Assignment assignment) { - acceptor.accept(assignment, SetKind.FirstSet); + acceptor.accept(assignment); doSwitch(assignment.getTerminal()); return this; } @@ -136,7 +136,7 @@ public class DefaultFollowElementCalculator implements IFollowElementCalculator @Override public ElementSwitch caseKeyword(Keyword object) { - acceptor.accept(object, SetKind.FirstSet); + acceptor.accept(object); return this; } diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultTemplateProposalProvider.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultTemplateProposalProvider.java index 6059e49..4151c49 100644 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/DefaultTemplateProposalProvider.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/DefaultTemplateProposalProvider.java @@ -5,7 +5,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import java.util.Collection; import java.util.Iterator; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/IProposalConflictHelper.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/IProposalConflictHelper.java new file mode 100644 index 0000000..2af6c53 --- a/dev/null +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/IProposalConflictHelper.java @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.ui.common.editor.contentassist; + +import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; + +/** + * @author Sebastian Zarnekow - Initial contribution and API + */ +public interface IProposalConflictHelper { + + boolean existsConflict(String proposal, ContentAssistContext context); + +}
\ No newline at end of file diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/ProposalConflictHelper.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/ProposalConflictHelper.java new file mode 100644 index 0000000..18aca56 --- a/dev/null +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/ProposalConflictHelper.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.ui.common.editor.contentassist; + +import org.eclipse.jface.text.Region; +import org.eclipse.xtext.parsetree.AbstractNode; +import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; +import org.eclipse.xtext.util.Strings; + +/** + * @author Sebastian Zarnekow - Initial contribution and API + */ +public abstract class ProposalConflictHelper implements IProposalConflictHelper { + + public boolean existsConflict(String proposal, ContentAssistContext context) { + // hidden node between lastCompleteNode and currentNode? + AbstractNode lastCompleteNode = context.getLastCompleteNode(); + Region replaceRegion = context.getReplaceRegion(); + int nodeEnd = lastCompleteNode.getOffset() + lastCompleteNode.getLength(); + if (nodeEnd < replaceRegion.getOffset()) + return false; + + return existsConflict(proposal, lastCompleteNode, replaceRegion.getOffset()); + } + + public abstract boolean existsConflict(String proposal, String lastCompleteText); + + public boolean existsConflict(String proposal, AbstractNode lastCompleteNode, int offset) { + String lastCompleteText = lastCompleteNode.serialize(); + lastCompleteText = lastCompleteText.substring(0, offset - lastCompleteNode.getTotalOffset()); + if (Strings.isEmpty(lastCompleteText)) + return false; + return existsConflict(proposal, lastCompleteText); + } + + public static class NullHelper extends ProposalConflictHelper { + + @Override + public boolean existsConflict(String proposal, String lastCompleteText) { + return false; + } + + } + +} diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/XtextTemplateContext.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/XtextTemplateContext.java index 3f8b7d5..01015b5 100644..100755 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/XtextTemplateContext.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/XtextTemplateContext.java @@ -5,7 +5,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.Position; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/XtextTemplateContextType.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/XtextTemplateContextType.java index 48f6102..2a9cf0a 100644..100755 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/XtextTemplateContextType.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/XtextTemplateContextType.java @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; +package org.eclipse.xtext.ui.common.editor.contentassist; import org.eclipse.jface.text.templates.GlobalTemplateVariables; import org.eclipse.jface.text.templates.TemplateContextType; diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/antlr/AntlrProposalConflictHelper.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/antlr/AntlrProposalConflictHelper.java new file mode 100644 index 0000000..5034d32 --- a/dev/null +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/antlr/AntlrProposalConflictHelper.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.ui.common.editor.contentassist.antlr; + +import org.antlr.runtime.ANTLRStringStream; +import org.antlr.runtime.CharStream; +import org.antlr.runtime.Token; +import org.eclipse.xtext.parser.antlr.Lexer; +import org.eclipse.xtext.ui.common.editor.contentassist.ProposalConflictHelper; + +import com.google.inject.Inject; + +/** + * @author Sebastian Zarnekow - Initial contribution and API + */ +public class AntlrProposalConflictHelper extends ProposalConflictHelper { + + @Inject + private Lexer lexer; + + public void setLexer(Lexer lexer) { + this.lexer = lexer; + } + + public Lexer getLexer() { + return lexer; + } + + @Override + public boolean existsConflict(String proposal, String lastCompleteText) { + String combinedText = lastCompleteText.concat(proposal); + CharStream stream = new ANTLRStringStream(combinedText); + lexer.setCharStream(stream); + + String[] expectedTexts = new String[] { lastCompleteText, proposal }; + for(String expected: expectedTexts) { + Token nextToken = lexer.nextToken(); + if (nextToken.equals(Token.EOF_TOKEN)) + return true; + String tokenText = nextToken.getText(); + if (!expected.equals(tokenText)) + return true; + } + Token lastToken = lexer.nextToken(); + if (!lastToken.equals(Token.EOF_TOKEN)) + return true; + return false; + } + +} diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractContentProposalProvider.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractContentProposalProvider.java deleted file mode 100755 index 45a6e4f..0000000 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractContentProposalProvider.java +++ b/dev/null @@ -1,146 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - *******************************************************************************/ -package org.eclipse.xtext.ui.common.editor.contentassist.impl; - -import org.eclipse.emf.ecore.EObject; -import org.eclipse.jface.text.contentassist.ICompletionProposal; -import org.eclipse.xtext.AbstractElement; -import org.eclipse.xtext.Assignment; -import org.eclipse.xtext.Keyword; -import org.eclipse.xtext.RuleCall; -import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; -import org.eclipse.xtext.ui.core.editor.contentassist.ICompletionProposalAcceptor; -import org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider; -import org.eclipse.xtext.util.XtextSwitch; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; - -/** - * The default implementation of interface {@link IContentProposalProvider} provided with Xtext. - * - * @author Michael Clay - Initial contribution and API - * @author Sebastian Zarnekow - Initial contribution and API - * @author Heiko Behrens - * @author Jan Köhnlein - */ -public abstract class AbstractContentProposalProvider implements IContentProposalProvider { - - public class DefaultContentAssistProcessorSwitch extends XtextSwitch<Boolean> { - - private final ContentAssistContext context; - private final ICompletionProposalAcceptor acceptor; - - public DefaultContentAssistProcessorSwitch(ContentAssistContext context, ICompletionProposalAcceptor acceptor) { - this.context = context; - this.acceptor = acceptor; - } - - @Override - public Boolean defaultCase(EObject object) { - return Boolean.TRUE; - } - - @Override - public Boolean caseKeyword(Keyword object) { - completeKeyword(object, context, acceptor); - return Boolean.TRUE; - } - - @Override - public Boolean caseRuleCall(RuleCall object) { - completeRuleCall(object, context, acceptor); - return Boolean.TRUE; - } - - @Override - public Boolean caseAssignment(Assignment object) { - completeAssignment(object, context, acceptor); - return Boolean.TRUE; - } - } - - public static class NullSafeCompletionProposalAcceptor extends ICompletionProposalAcceptor.Delegate { - - public NullSafeCompletionProposalAcceptor(ICompletionProposalAcceptor delegate) { - super(); - setDelegate(delegate); - } - - @Override - public void accept(ICompletionProposal proposal) { - if (proposal != null) - super.accept(proposal); - } - } - - public void createProposals(ContentAssistContext context, ICompletionProposalAcceptor acceptor) { - ICompletionProposalAcceptor nullSafe = new NullSafeCompletionProposalAcceptor(acceptor); - DefaultContentAssistProcessorSwitch selector = new DefaultContentAssistProcessorSwitch(context, nullSafe); - for (AbstractElement element : context.getFirstSetGrammarElements()) { - selector.doSwitch(element); - } - } - - public abstract void completeKeyword(Keyword object, ContentAssistContext context, - ICompletionProposalAcceptor acceptor); - - public abstract void completeRuleCall(RuleCall object, ContentAssistContext context, - ICompletionProposalAcceptor acceptor); - - public abstract void completeAssignment(Assignment object, ContentAssistContext context, - ICompletionProposalAcceptor acceptor); - - public DefaultContentAssistProcessorSwitch createSelector(ContentAssistContext context, - ICompletionProposalAcceptor acceptor) { - return new DefaultContentAssistProcessorSwitch(context, acceptor); - } - - public static class FilteringCompletionProposalAcceptor extends ICompletionProposalAcceptor.Delegate { - - private final Predicate<ICompletionProposal> filter; - - public FilteringCompletionProposalAcceptor(ICompletionProposalAcceptor delegate, Predicate<ICompletionProposal> filter) { - super(); - this.filter = filter; - setDelegate(delegate); - } - - @Override - public void accept(ICompletionProposal proposal) { - if (filter.apply(proposal)) - super.accept(proposal); - } - - } - - public static class ModifyingCompletionProposalAcceptor extends ICompletionProposalAcceptor.Delegate { - private final Function<ICompletionProposal, ICompletionProposal> modifier; - - public ModifyingCompletionProposalAcceptor(ICompletionProposalAcceptor delegate, Function<ICompletionProposal, ICompletionProposal> modifier) { - super(); - this.modifier = modifier; - setDelegate(delegate); - } - - @Override - public void accept(ICompletionProposal proposal) { - if (proposal != null) - super.accept(modifier.apply(proposal)); - } - } - - public ICompletionProposalAcceptor filter(ICompletionProposalAcceptor acceptor, Predicate<ICompletionProposal> filter) { - return new FilteringCompletionProposalAcceptor(acceptor, Predicates.and(Predicates.notNull(), filter)); - } - - public ICompletionProposalAcceptor modify(ICompletionProposalAcceptor acceptor, Function<ICompletionProposal, ICompletionProposal> modifier) { - return new ModifyingCompletionProposalAcceptor(acceptor, modifier); - } -} diff --git a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/service/DefaultUIModule.java b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/service/DefaultUIModule.java index 49cca10..8c14055 100644 --- a/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/service/DefaultUIModule.java +++ b/plugins/org.eclipse.xtext.ui.common/src/org/eclipse/xtext/ui/common/service/DefaultUIModule.java @@ -17,11 +17,13 @@ import org.eclipse.jface.text.rules.ITokenScanner; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.eclipse.xtext.service.AbstractGenericModule; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.DefaultCompletionProposalPostProcessor; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.DefaultContentAssistContextFactory; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.DefaultContentAssistantFactory; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.DefaultFollowElementCalculator; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.DefaultTemplateProposalProvider; +import org.eclipse.xtext.ui.common.editor.contentassist.DefaultCompletionProposalPostProcessor; +import org.eclipse.xtext.ui.common.editor.contentassist.DefaultContentAssistContextFactory; +import org.eclipse.xtext.ui.common.editor.contentassist.DefaultContentAssistantFactory; +import org.eclipse.xtext.ui.common.editor.contentassist.DefaultFollowElementCalculator; +import org.eclipse.xtext.ui.common.editor.contentassist.DefaultTemplateProposalProvider; +import org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper; +import org.eclipse.xtext.ui.common.editor.contentassist.ProposalConflictHelper; import org.eclipse.xtext.ui.common.editor.hyperlinking.DefaultHyperlinkDetector; import org.eclipse.xtext.ui.common.editor.outline.XtextContentOutlinePage; import org.eclipse.xtext.ui.common.editor.syntaxcoloring.DefaultTokenScanner; @@ -115,6 +117,10 @@ public abstract class DefaultUIModule extends AbstractGenericModule { return DefaultFollowElementCalculator.class; } + public Class<? extends IProposalConflictHelper> bindIProposalConflictHelper() { + return ProposalConflictHelper.NullHelper.class; + } + public Class<? extends AdapterFactoryLabelProvider> bindAdapterFactoryLabelProvider() { return InjectableAdapterFactoryLabelProvider.class; } diff --git a/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/DefaultLabelProvider.java b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/DefaultLabelProvider.java index c4f56fe..d3a0b7c 100644 --- a/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/DefaultLabelProvider.java +++ b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/DefaultLabelProvider.java @@ -7,18 +7,8 @@ *******************************************************************************/ package org.eclipse.xtext.ui.core; -import java.util.Collections; - -import org.eclipse.emf.common.util.WrappedException; -import org.eclipse.emf.ecore.EAttribute; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.util.FeatureMap; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; -import org.eclipse.xtext.util.PolymorphicDispatcher; import com.google.inject.Inject; @@ -27,110 +17,19 @@ import com.google.inject.Inject; * @author Peter Friese - Implementation * @author Sebastian Zarnekow */ -public class DefaultLabelProvider extends LabelProvider { - - private final PolymorphicDispatcher<String> getText = new PolymorphicDispatcher<String>("text",1,1,Collections.singletonList(this), - new PolymorphicDispatcher.ErrorHandler<String>(){ - - private final PolymorphicDispatcher<String> recoverText = new PolymorphicDispatcher<String>("error_text",2,2,Collections.singletonList(DefaultLabelProvider.this)); - - public String handle(Object[] params, Throwable e) { - return recoverText.invoke(params[0], e); - } - }); - - private final PolymorphicDispatcher<String> getImage = new PolymorphicDispatcher<String>("image",1,1,Collections.singletonList(this), - new PolymorphicDispatcher.ErrorHandler<String>(){ - - private final PolymorphicDispatcher<String> recoverImage = new PolymorphicDispatcher<String>("error_image",2,2,Collections.singletonList(DefaultLabelProvider.this)); - - public String handle(Object[] params, Throwable e) { - return recoverImage.invoke(params[0],e); - } - }); - - @Inject - private IImageHelper imageHelper; +public class DefaultLabelProvider extends SimpleLabelProvider { @Inject private AdapterFactoryLabelProvider adapterFactoryLabelProvider; @Override - public String getText(Object element) { - return getText.invoke(element); - } - - @Override public Image getImage(Object element) { - String imageName = getImage.invoke(element); + String imageName = getImageDispatcher().invoke(element); if (imageName == null && adapterFactoryLabelProvider != null) return adapterFactoryLabelProvider.getImage(element); return getImageHelper().getImage(imageName); } - - public String error_text(Object object, Exception e) { - throw new WrappedException(e); - } - public String error_text(Object object, NullPointerException e) { - return text(object); - } - - public String text(Object object) { - if (object instanceof EObject) { - EObject eObject = (EObject) object; - EClass eClass = eObject.eClass(); - - EStructuralFeature feature = getLabelFeature(eClass); - if (feature != null) { - Object value = eObject.eGet(feature); - if (value != null) { - return value.toString(); - } - } - return eClass.getName(); - } - return "<unknown>"; - } - - public String error_image(Object object, Exception e) { - throw new WrappedException(e); - } - public String error_image(Object object, NullPointerException e) { - return image(object); - } - public String image(Object obj) { - return null; - } - - protected EStructuralFeature getLabelFeature(EClass eClass) { - EAttribute result = null; - for (EAttribute eAttribute : eClass.getEAllAttributes()) { - if (!eAttribute.isMany() && eAttribute.getEType().getInstanceClass() != FeatureMap.Entry.class) { - if ("name".equalsIgnoreCase(eAttribute.getName())) { - result = eAttribute; - break; - } - else if (result == null) { - result = eAttribute; - } - else if (eAttribute.getEAttributeType().getInstanceClass() == String.class - && result.getEAttributeType().getInstanceClass() != String.class) { - result = eAttribute; - } - } - } - return result; - } - - public void setImageHelper(IImageHelper imageHelper) { - this.imageHelper = imageHelper; - } - - public IImageHelper getImageHelper() { - return imageHelper; - } - public AdapterFactoryLabelProvider getAdapterFactoryLabelProvider() { return adapterFactoryLabelProvider; } diff --git a/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/SimpleLabelProvider.java b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/SimpleLabelProvider.java new file mode 100644 index 0000000..3567dc6 --- a/dev/null +++ b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/SimpleLabelProvider.java @@ -0,0 +1,138 @@ +/******************************************************************************* + * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.ui.core; + +import java.util.Collections; + +import org.eclipse.emf.common.util.WrappedException; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.util.FeatureMap; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Image; +import org.eclipse.xtext.util.PolymorphicDispatcher; + +import com.google.inject.Inject; + +/** + * @author Sebastian Zarnekow - Initial contribution and API + */ +public class SimpleLabelProvider extends LabelProvider { + + private final PolymorphicDispatcher<String> textDispatcher = new PolymorphicDispatcher<String>("text", 1, 1, + Collections.singletonList(this), new PolymorphicDispatcher.ErrorHandler<String>() { + + private final PolymorphicDispatcher<String> recoverText = new PolymorphicDispatcher<String>( + "error_text", 2, 2, Collections.singletonList(SimpleLabelProvider.this)); + + public String handle(Object[] params, Throwable e) { + return recoverText.invoke(params[0], e); + } + }); + + private final PolymorphicDispatcher<String> imageDispatcher = new PolymorphicDispatcher<String>("image", 1, 1, + Collections.singletonList(this), new PolymorphicDispatcher.ErrorHandler<String>() { + + private final PolymorphicDispatcher<String> recoverImage = new PolymorphicDispatcher<String>( + "error_image", 2, 2, Collections.singletonList(SimpleLabelProvider.this)); + + public String handle(Object[] params, Throwable e) { + return recoverImage.invoke(params[0], e); + } + }); + + @Inject + private IImageHelper imageHelper; + + @Override + public String getText(Object element) { + return getTextDispatcher().invoke(element); + } + + @Override + public Image getImage(Object element) { + String imageName = getImageDispatcher().invoke(element); + return getImageHelper().getImage(imageName); + } + + public String error_text(Object object, Exception e) { + throw new WrappedException(e); + } + + public String error_text(Object object, NullPointerException e) { + return text(object); + } + + public String text(Object object) { + if (object instanceof EObject) { + EObject eObject = (EObject) object; + EClass eClass = eObject.eClass(); + + EStructuralFeature feature = getLabelFeature(eClass); + if (feature != null) { + Object value = eObject.eGet(feature); + if (value != null) { + return value.toString(); + } + } + return eClass.getName(); + } + return "<unknown>"; + } + + public String error_image(Object object, Exception e) { + throw new WrappedException(e); + } + + public String error_image(Object object, NullPointerException e) { + return image(object); + } + + public String image(Object obj) { + return null; + } + + protected EStructuralFeature getLabelFeature(EClass eClass) { + EAttribute result = null; + for (EAttribute eAttribute : eClass.getEAllAttributes()) { + if (!eAttribute.isMany() && eAttribute.getEType().getInstanceClass() != FeatureMap.Entry.class) { + if ("name".equalsIgnoreCase(eAttribute.getName())) { + result = eAttribute; + break; + } + else if (result == null) { + result = eAttribute; + } + else if (eAttribute.getEAttributeType().getInstanceClass() == String.class + && result.getEAttributeType().getInstanceClass() != String.class) { + result = eAttribute; + } + } + } + return result; + } + + public void setImageHelper(IImageHelper imageHelper) { + this.imageHelper = imageHelper; + } + + public IImageHelper getImageHelper() { + return imageHelper; + } + + public PolymorphicDispatcher<String> getTextDispatcher() { + return textDispatcher; + } + + public PolymorphicDispatcher<String> getImageDispatcher() { + return imageDispatcher; + } + +} diff --git a/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/ContentAssistContext.java b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/ContentAssistContext.java index bcab07b..e19703e 100644 --- a/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/ContentAssistContext.java +++ b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/ContentAssistContext.java @@ -46,13 +46,11 @@ public class ContentAssistContext implements IFollowElementAcceptor { private Region replaceRegion; private PrefixMatcher matcher; private final List<AbstractElement> firstSetGrammarElements; - private final List<AbstractElement> followSetGrammarElements; @Inject public ContentAssistContext() { super(); firstSetGrammarElements = new ArrayList<AbstractElement>(); - followSetGrammarElements = new ArrayList<AbstractElement>(); } public String getPrefix() { @@ -107,19 +105,10 @@ public class ContentAssistContext implements IFollowElementAcceptor { return (IXtextDocument) viewer.getDocument(); } - public void accept(AbstractElement element, IFollowElementCalculator.SetKind kind) { - if (element == null || kind == null) - throw new NullPointerException("element or kind was null. element: '" + element + "' kind: '" + kind + "'"); - switch (kind) { - case FirstSet: - getFirstSetGrammarElements().add(element); - break; - case FollowSet: - getFollowSetGrammarElements().add(element); - break; - default: - throw new IllegalArgumentException("Unexpected kind: '" + kind + "'"); - } + public void accept(AbstractElement element) { + if (element == null) + throw new NullPointerException("element may not be null"); + getFirstSetGrammarElements().add(element); } public void setLastCompleteNode(AbstractNode lastCompleteNode) { @@ -158,10 +147,6 @@ public class ContentAssistContext implements IFollowElementAcceptor { return firstSetGrammarElements; } - public List<AbstractElement> getFollowSetGrammarElements() { - return followSetGrammarElements; - } - public void setMatcher(PrefixMatcher matcher) { this.matcher = matcher; } diff --git a/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/IFollowElementCalculator.java b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/IFollowElementCalculator.java index 8f1fa2a..5b577e5 100644 --- a/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/IFollowElementCalculator.java +++ b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/IFollowElementCalculator.java @@ -20,12 +20,8 @@ import org.eclipse.xtext.parsetree.CompositeNode; */ public interface IFollowElementCalculator { - enum SetKind { - FirstSet, FollowSet - } - interface IFollowElementAcceptor { - void accept(AbstractElement element, SetKind kind); + void accept(AbstractElement element); } /** diff --git a/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/PrefixMatcher.java b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/PrefixMatcher.java index 024fe51..4395417 100644 --- a/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/PrefixMatcher.java +++ b/plugins/org.eclipse.xtext.ui.core/src/org/eclipse/xtext/ui/core/editor/contentassist/PrefixMatcher.java @@ -14,12 +14,12 @@ import com.google.inject.ImplementedBy; /** * @author Sebastian Zarnekow - Initial contribution and API */ -@ImplementedBy(PrefixMatcher.Simple.class) +@ImplementedBy(PrefixMatcher.IgnoreCase.class) public abstract class PrefixMatcher { public abstract boolean isCandidateMatchingPrefix(String name, String prefix); - public static class Simple extends PrefixMatcher { + public static class IgnoreCase extends PrefixMatcher { @Override public boolean isCandidateMatchingPrefix(String name, String prefix) { return name.regionMatches(true, 0, prefix, 0, prefix.length()); @@ -35,6 +35,131 @@ public abstract class PrefixMatcher { boolean result = pattern.matches(name); return result; } + +// @SuppressWarnings("restriction") +// public boolean camelCaseMatch(char[] pattern, int patternStart, int patternEnd, char[] name, int nameStart, int nameEnd, boolean samePartCount) { +// +// /* !!!!!!!!!! WARNING !!!!!!!!!! +// * The algorithm implemented in this method has been heavily used in +// * StringOperation#getCamelCaseMatchingRegions(String, int, int, String, int, int, boolean) +// * method. +// * +// * So, if any change needs to be applied in the current algorithm, +// * do NOT forget to also apply the same change in the StringOperation method! +// */ +// +// if (name == null) +// return false; // null name cannot match +// if (pattern == null) +// return true; // null pattern is equivalent to '*' +// if (patternEnd < 0) patternEnd = pattern.length; +// if (nameEnd < 0) nameEnd = name.length; +// +// if (patternEnd <= patternStart) return nameEnd <= nameStart; +// if (nameEnd <= nameStart) return false; +// // check first pattern char +// if (name[nameStart] != pattern[patternStart]) { +// // first char must strictly match (upper/lower) +// return false; +// } +// +// char patternChar, nameChar; +// int iPattern = patternStart; +// int iName = nameStart; +// +// // Main loop is on pattern characters +// while (true) { +// +// iPattern++; +// iName++; +// +// if (iPattern == patternEnd) { // we have exhausted pattern... +// // it's a match if the name can have additional parts (i.e. uppercase characters) or is also exhausted +// if (!samePartCount || iName == nameEnd) return true; +// +// // otherwise it's a match only if the name has no more uppercase characters +// while (true) { +// if (iName == nameEnd) { +// // we have exhausted the name, so it's a match +// return true; +// } +// nameChar = name[iName]; +// // test if the name character is uppercase +// if (nameChar < ScannerHelper.MAX_OBVIOUS) { +// if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[nameChar] & ScannerHelper.C_UPPER_LETTER) != 0) { +// return false; +// } +// } +// else if (!Character.isJavaIdentifierPart(nameChar) || Character.isUpperCase(nameChar)) { +// return false; +// } +// iName++; +// } +// } +// +// if (iName == nameEnd){ +// // We have exhausted the name (and not the pattern), so it's not a match +// return false; +// } +// +// // For as long as we're exactly matching, bring it on (even if it's a lower case character) +// if ((patternChar = pattern[iPattern]) == name[iName]) { +// continue; +// } +// +// // If characters are not equals, then it's not a match if patternChar is lowercase +// if (patternChar < ScannerHelper.MAX_OBVIOUS) { +// if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[patternChar] & (ScannerHelper.C_UPPER_LETTER | ScannerHelper.C_DIGIT)) == 0) { +// return false; +// } +// } +// else if (Character.isJavaIdentifierPart(patternChar) && !Character.isUpperCase(patternChar) && !Character.isDigit(patternChar)) { +// return false; +// } +// +// // patternChar is uppercase, so let's find the next uppercase in name +// while (true) { +// if (iName == nameEnd){ +// // We have exhausted name (and not pattern), so it's not a match +// return false; +// } +// +// nameChar = name[iName]; +// if (nameChar < ScannerHelper.MAX_OBVIOUS) { +// int charNature = ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[nameChar]; +// if ((charNature & (ScannerHelper.C_LOWER_LETTER | ScannerHelper.C_SPECIAL)) != 0) { +// // nameChar is lowercase +// iName++; +// } else if ((charNature & ScannerHelper.C_DIGIT) != 0) { +// // nameChar is digit => break if the digit is current pattern character otherwise consume it +// if (patternChar == nameChar) break; +// iName++; +// // nameChar is uppercase... +// } else if (patternChar != nameChar) { +// //.. and it does not match patternChar, so it's not a match +// return false; +// } else { +// //.. and it matched patternChar. Back to the big loop +// break; +// } +// } +// // Same tests for non-obvious characters +// else if (Character.isJavaIdentifierPart(nameChar) && !Character.isUpperCase(nameChar)) { +// iName++; +// } else if (Character.isDigit(nameChar)) { +// if (patternChar == nameChar) break; +// iName++; +// } else if (patternChar != nameChar) { +// return false; +// } else { +// break; +// } +// } +// // At this point, either name has been exhausted, or it is at an uppercase letter. +// // Since pattern is also at an uppercase letter +// } +// } + } } diff --git a/plugins/org.eclipse.xtext.ui.generator/src/org/eclipse/xtext/ui/generator/contentAssist/JavaBasedContentAssistFragment.xpt b/plugins/org.eclipse.xtext.ui.generator/src/org/eclipse/xtext/ui/generator/contentAssist/JavaBasedContentAssistFragment.xpt index 8e275e7..8112889 100755 --- a/plugins/org.eclipse.xtext.ui.generator/src/org/eclipse/xtext/ui/generator/contentAssist/JavaBasedContentAssistFragment.xpt +++ b/plugins/org.eclipse.xtext.ui.generator/src/org/eclipse/xtext/ui/generator/contentAssist/JavaBasedContentAssistFragment.xpt @@ -31,7 +31,7 @@ import org.eclipse.xtext.RuleCall; «IF inherit && usedGrammars.size == 1-» import «usedGrammars.first().getProposalProvider()»; «ELSE-» -import org.eclipse.xtext.ui.common.editor.contentassist.impl.AbstractJavaBasedContentProposalProvider; +import org.eclipse.xtext.ui.common.editor.contentassist.AbstractJavaBasedContentProposalProvider; «ENDIF-» import org.eclipse.xtext.ui.core.editor.contentassist.ICompletionProposalAcceptor; import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; diff --git a/plugins/org.eclipse.xtext.xtend/src/org/eclipse/xtext/xtend/contentassist/AbstractXtendProposalProvider.java b/plugins/org.eclipse.xtext.xtend/src/org/eclipse/xtext/xtend/contentassist/AbstractXtendProposalProvider.java index 3028d6c..efefc3a 100644 --- a/plugins/org.eclipse.xtext.xtend/src/org/eclipse/xtext/xtend/contentassist/AbstractXtendProposalProvider.java +++ b/plugins/org.eclipse.xtext.xtend/src/org/eclipse/xtext/xtend/contentassist/AbstractXtendProposalProvider.java @@ -18,7 +18,7 @@ import org.eclipse.xtext.GrammarUtil; import org.eclipse.xtext.Keyword; import org.eclipse.xtext.ParserRule; import org.eclipse.xtext.RuleCall; -import org.eclipse.xtext.ui.common.editor.contentassist.impl.AbstractContentProposalProvider; +import org.eclipse.xtext.ui.common.editor.contentassist.AbstractContentProposalProvider; import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.core.editor.contentassist.ICompletionProposalAcceptor; import org.eclipse.xtext.util.Strings; diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/indexbased/IndexBasedScopeProviderTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/indexbased/IndexBasedScopeProviderTest.java index c383cfc..160ffc1 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/indexbased/IndexBasedScopeProviderTest.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/indexbased/IndexBasedScopeProviderTest.java @@ -64,14 +64,15 @@ public class IndexBasedScopeProviderTest extends AbstractGeneratorTest { assertTrue(names.contains("D")); assertEquals(4,names.size()); - Iterator<ECrossReferenceDescriptor> crossRefs = set.getStore().eCrossReferenceDAO().createQuery().executeListResult().iterator(); - crossRefs.next(); - crossRefs.next(); - crossRefs.next(); - assertFalse(crossRefs.hasNext()); + // TODO +// Iterator<ECrossReferenceDescriptor> crossRefs = set.getStore().eCrossReferenceDAO().createQuery().executeListResult().iterator(); +// crossRefs.next(); +// crossRefs.next(); +// crossRefs.next(); +// assertFalse(crossRefs.hasNext()); } - private INameProvider nameProvider = new AbstractDeclarativeNameProvider() { + private final INameProvider nameProvider = new AbstractDeclarativeNameProvider() { @SuppressWarnings("unused") public String getName(Type type) { return type.getName(); diff --git a/tests/org.eclipse.xtext.ui.common.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.xtext.ui.common.tests/META-INF/MANIFEST.MF index f5c9476..7fe4379 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/META-INF/MANIFEST.MF +++ b/tests/org.eclipse.xtext.ui.common.tests/META-INF/MANIFEST.MF @@ -31,7 +31,8 @@ Require-Bundle: org.eclipse.ui, org.eclipse.xtend.typesystem.emf,
org.antlr.runtime,
org.eclipse.ui.editors,
- org.eclipse.xtext.xtext.ui
+ org.eclipse.xtext.xtext.ui,
+ org.eclipse.xpand;bundle-version="0.7.0"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Bundle-ActivationPolicy: lazy
Export-Package: org.eclipse.xtext.ui.common,
diff --git a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/AbstractXtextGrammarTestLanguageUiModule.java b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/AbstractXtextGrammarTestLanguageUiModule.java index 2493f7d..b45c44f 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/AbstractXtextGrammarTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/AbstractXtextGrammarTestLanguageUiModule.java @@ -28,8 +28,18 @@ public abstract class AbstractXtextGrammarTestLanguageUiModule extends DefaultUI } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.XtextGrammarTestLanguageProposalProvider.class; } + + public Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() { + return org.eclipse.xtext.ui.core.SimpleLabelProvider.class; + } + } diff --git a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/enumrules/AbstractEnumRulesTestLanguageUiModule.java b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/enumrules/AbstractEnumRulesTestLanguageUiModule.java index e875a72..2b58185 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/enumrules/AbstractEnumRulesTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/enumrules/AbstractEnumRulesTestLanguageUiModule.java @@ -28,8 +28,18 @@ public abstract class AbstractEnumRulesTestLanguageUiModule extends DefaultUIMod } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.enumrules.EnumRulesTestLanguageProposalProvider.class; } + + public Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() { + return org.eclipse.xtext.ui.core.SimpleLabelProvider.class; + } + } diff --git a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/parser/keywords/AbstractKeywordsTestLanguageUiModule.java b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/parser/keywords/AbstractKeywordsTestLanguageUiModule.java index 3d8d9d9..f0ac401 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/parser/keywords/AbstractKeywordsTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/parser/keywords/AbstractKeywordsTestLanguageUiModule.java @@ -28,8 +28,18 @@ public abstract class AbstractKeywordsTestLanguageUiModule extends DefaultUIModu } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.parser.keywords.KeywordsTestLanguageProposalProvider.class; } + + public Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() { + return org.eclipse.xtext.ui.core.SimpleLabelProvider.class; + } + } diff --git a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractContentAssistTestLanguageUiModule.java b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractContentAssistTestLanguageUiModule.java index 4764e87..bcf4df2 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractContentAssistTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractContentAssistTestLanguageUiModule.java @@ -28,8 +28,18 @@ public abstract class AbstractContentAssistTestLanguageUiModule extends DefaultU } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.testlanguages.ContentAssistTestLanguageProposalProvider.class; } + + public Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() { + return org.eclipse.xtext.ui.core.SimpleLabelProvider.class; + } + } diff --git a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractReferenceGrammarTestLanguageUiModule.java b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractReferenceGrammarTestLanguageUiModule.java index 93829c1..a944596 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractReferenceGrammarTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractReferenceGrammarTestLanguageUiModule.java @@ -28,8 +28,18 @@ public abstract class AbstractReferenceGrammarTestLanguageUiModule extends Defau } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.testlanguages.ReferenceGrammarTestLanguageProposalProvider.class; } + + public Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() { + return org.eclipse.xtext.ui.core.SimpleLabelProvider.class; + } + } diff --git a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractTreeTestLanguageUiModule.java b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractTreeTestLanguageUiModule.java index fb5fcb4..27a545d 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractTreeTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractTreeTestLanguageUiModule.java @@ -28,8 +28,18 @@ public abstract class AbstractTreeTestLanguageUiModule extends DefaultUIModule { } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.testlanguages.TreeTestLanguageProposalProvider.class; } + + public Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() { + return org.eclipse.xtext.ui.core.SimpleLabelProvider.class; + } + } diff --git a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractTwoContextsTestLanguageUiModule.java b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractTwoContextsTestLanguageUiModule.java index e4d2244..4b9d110 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractTwoContextsTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src-gen/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractTwoContextsTestLanguageUiModule.java @@ -28,8 +28,18 @@ public abstract class AbstractTwoContextsTestLanguageUiModule extends DefaultUIM } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.ui.common.editor.contentassist.impl.TwoContextsTestLanguageProposalProvider.class; } + + public Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() { + return org.eclipse.xtext.ui.core.SimpleLabelProvider.class; + } + } diff --git a/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/SimpleLabelProviderFragment.java b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/SimpleLabelProviderFragment.java new file mode 100644 index 0000000..d0de46e --- a/dev/null +++ b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/SimpleLabelProviderFragment.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.ui.common; + +import java.util.Map; + +import org.eclipse.xpand2.XpandExecutionContext; +import org.eclipse.xtext.Grammar; +import org.eclipse.xtext.generator.AbstractGeneratorFragment; +import org.eclipse.xtext.generator.BindFactory; +import org.eclipse.xtext.generator.BindKey; +import org.eclipse.xtext.generator.BindValue; + +/** + * @author Sebastian Zarnekow - Initial contribution and API + */ +public class SimpleLabelProviderFragment extends AbstractGeneratorFragment { + + @Override + public Map<BindKey, BindValue> getGuiceBindingsUi(Grammar grammar) { + return new BindFactory().addTypeToType( + "org.eclipse.jface.viewers.ILabelProvider", + "org.eclipse.xtext.ui.core.SimpleLabelProvider").getBindings(); + } + + @Override + public void generate(Grammar grammar, XpandExecutionContext ctx) { + // noop + } + + @Override + public void addToStandaloneSetup(Grammar grammar, XpandExecutionContext ctx) { + // noop + } + + @Override + public void addToPluginXmlRt(Grammar grammar, XpandExecutionContext ctx) { + // noop + } + + @Override + public void addToPluginXmlUi(Grammar grammar, XpandExecutionContext ctx) { + // noop + } + +} diff --git a/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/TestLanguageSetup.mwe b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/TestLanguageSetup.mwe index 79683ef..edf21f8 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/TestLanguageSetup.mwe +++ b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/TestLanguageSetup.mwe @@ -12,4 +12,5 @@ <fragment class="de.itemis.xtext.antlr.XtextAntlrGeneratorFragment"/> <fragment file="org/eclipse/xtext/ui/generator/StandardUiFragments.mwe" inheritAll="true"/> + <fragment class="org.eclipse.xtext.ui.common.SimpleLabelProviderFragment"/> </config>
\ No newline at end of file diff --git a/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractContentAssistProcessorTest.java b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractContentAssistProcessorTest.java index 0c2cc4d..47dbd20 100755 --- a/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractContentAssistProcessorTest.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/AbstractContentAssistProcessorTest.java @@ -60,7 +60,7 @@ public abstract class AbstractContentAssistProcessorTest extends AbstractXtextTe .append("kind ").assertCount(1)
.append("(k1 0) erwachsener(e1 0) erwachsener(e2 0) familie( f1 ").assertCount(2)
.append("e1 ").assertCount(2)
- .append("e2").assertCount(2);
+ .append("e2").assertCount(1);
}
public void testComputeCompletionProposalsText() throws Exception {
@@ -101,10 +101,10 @@ public abstract class AbstractContentAssistProcessorTest extends AbstractXtextTe builder.append(" ER").assertText("erwachsener");
builder.append(" SP").assertText("spielzeug");
builder.append(" FA").assertText("familie");
- builder.append(" familie ( KEY").assertText("keyword", "e1", "e2");
- builder.append(" familie ( K").assertText("keyword", "e1", "e2");
+ builder.append(" familie ( KEY").assertText("keyword");
+ builder.append(" familie ( K").assertText("keyword");
builder.append(" familie ( keyword E").assertText("e1", "e2");
- builder.append(" familie ( keyword e1 E").assertText("e1", "e2", "k1", "k2");
+ builder.append(" familie ( keyword e1 E").assertText("e1", "e2");
builder.append(" familie ( keyword e1 e2 K").assertText("k1", "k2", ",", ")");
builder.append(" familie ( keyword e1 e2 k1,K").assertText("k1", "k2",",", ")");
builder.append(" familie ( keyword e1 e2 k1,k2").assertText("k2", ",", ")");
@@ -335,11 +335,9 @@ public abstract class AbstractContentAssistProcessorTest extends AbstractXtextTe "=",
"?",
"?=",
- "Feature",
- "MyRule",
"{")
.appendNl(";")
- .append("terminal Other_Id").assertText(":","returns");
+ .append("terminal Other_Id").assertText(":");
}
/**
@@ -390,7 +388,7 @@ public abstract class AbstractContentAssistProcessorTest extends AbstractXtextTe }
public void testEnumCompletion_04() throws Exception {
- newBuilder(setup.getEnumsLangSetup()).append("existing").assertText("SameName", "DifferentLiteral", "overridden", "existing");
+ newBuilder(setup.getEnumsLangSetup()).append("existing").assertText("existing");
}
public void testEnumCompletion_05() throws Exception {
diff --git a/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/ContentAssistProcessorTestBuilder.java b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/ContentAssistProcessorTestBuilder.java index d9668eb..4fdebba 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/ContentAssistProcessorTestBuilder.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/ContentAssistProcessorTestBuilder.java @@ -33,6 +33,7 @@ import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.xtext.ISetup; import org.eclipse.xtext.junit.AbstractXtextTests; import org.eclipse.xtext.resource.XtextResource; +import org.eclipse.xtext.ui.common.editor.contentassist.ConfigurableCompletionProposal; import org.eclipse.xtext.ui.core.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.core.editor.model.IXtextDocument; import org.eclipse.xtext.ui.core.editor.model.UnitOfWork; diff --git a/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/JavaContentAssistProcessorTestSetup.java b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/JavaContentAssistProcessorTestSetup.java index 1b0f192..d41c129 100644 --- a/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/JavaContentAssistProcessorTestSetup.java +++ b/tests/org.eclipse.xtext.ui.common.tests/src/org/eclipse/xtext/ui/common/editor/contentassist/impl/JavaContentAssistProcessorTestSetup.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.xtext.ui.common.editor.contentassist.impl; +import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.xtext.ISetup; import org.eclipse.xtext.XtextGrammarTestLanguageRuntimeModule; import org.eclipse.xtext.XtextGrammarTestLanguageStandaloneSetup; @@ -26,6 +27,7 @@ import org.eclipse.xtext.testlanguages.ContentAssistTestLanguageUiModule; import org.eclipse.xtext.testlanguages.ReferenceGrammarTestLanguageRuntimeModule; import org.eclipse.xtext.testlanguages.ReferenceGrammarTestLanguageStandaloneSetup; import org.eclipse.xtext.testlanguages.ReferenceGrammarTestLanguageUiModule; +import org.eclipse.xtext.ui.core.SimpleLabelProvider; import com.google.inject.Guice; import com.google.inject.Injector; @@ -57,7 +59,12 @@ public class JavaContentAssistProcessorTestSetup implements IContentAssistProces return new XtextStandaloneSetup() { @Override public Injector createInjector() { - return Guice.createInjector(new XtextRuntimeModule(), new XtextUiModule()); + return Guice.createInjector(new XtextRuntimeModule(), new XtextUiModule() { + @Override + public Class<? extends ILabelProvider> bindILabelProvider() { + return SimpleLabelProvider.class; + } + }); } }; } diff --git a/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/editor/contentassist/CamelCasePrefixMatcherTest.java b/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/editor/contentassist/CamelCasePrefixMatcherTest.java new file mode 100644 index 0000000..a724029 --- a/dev/null +++ b/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/editor/contentassist/CamelCasePrefixMatcherTest.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.ui.core.editor.contentassist; + +import org.eclipse.xtext.ui.core.editor.contentassist.PrefixMatcher.CamelCase; + +/** + * @author Sebastian Zarnekow - Initial contribution and API + */ +public class CamelCasePrefixMatcherTest extends PrefixMatcherTest<PrefixMatcher.CamelCase>{ + + @Override + protected CamelCase createMatcher() { + return new PrefixMatcher.CamelCase(); + } + + public void testCamelCasePrefix() { + assertTrue(matcher.isCandidateMatchingPrefix("ExactMatch", "ExMa")); + assertTrue(matcher.isCandidateMatchingPrefix("EXACTMatch", "EXACT")); + assertTrue(matcher.isCandidateMatchingPrefix("EXactMatch", "EXM")); + } + + public void testCamelCaseMisMatch() { + assertFalse(matcher.isCandidateMatchingPrefix("ExactMatch", "EXMa")); + } + + // Fix the implementation to assert the following test cases when inverted + public void testFixMe() { + assertTrue(matcher.isCandidateMatchingPrefix("EXACTMatch", "EXaCT")); + assertFalse(matcher.isCandidateMatchingPrefix("exactMatch", "exM")); + assertTrue(matcher.isCandidateMatchingPrefix("EXactMatch", "EXACTm")); + } +} diff --git a/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/editor/contentassist/IgnoreCasePrefixMatcherTest.java b/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/editor/contentassist/IgnoreCasePrefixMatcherTest.java new file mode 100644 index 0000000..44f15dd --- a/dev/null +++ b/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/editor/contentassist/IgnoreCasePrefixMatcherTest.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.ui.core.editor.contentassist; + +import org.eclipse.xtext.ui.core.editor.contentassist.PrefixMatcher.IgnoreCase; + +/** + * @author Sebastian Zarnekow - Initial contribution and API + */ +public class IgnoreCasePrefixMatcherTest extends PrefixMatcherTest<PrefixMatcher.IgnoreCase> { + + @Override + protected IgnoreCase createMatcher() { + return new PrefixMatcher.IgnoreCase(); + } + + public void testCamelCaseMismatch() { + assertFalse(matcher.isCandidateMatchingPrefix("ExactMatch", "ExMa")); + assertFalse(matcher.isCandidateMatchingPrefix("exactMatch", "exM")); + assertFalse(matcher.isCandidateMatchingPrefix("eXactMatch", "eXM")); + } +} diff --git a/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/editor/contentassist/PrefixMatcherTest.java b/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/editor/contentassist/PrefixMatcherTest.java new file mode 100644 index 0000000..9ea2f06 --- a/dev/null +++ b/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/editor/contentassist/PrefixMatcherTest.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.ui.core.editor.contentassist; + +import junit.framework.TestCase; + +/** + * @author Sebastian Zarnekow - Initial contribution and API + */ +public abstract class PrefixMatcherTest<Matcher extends PrefixMatcher> extends TestCase { + + protected Matcher matcher; + + @Override + protected void setUp() throws Exception { + super.setUp(); + matcher = createMatcher(); + } + + protected abstract Matcher createMatcher(); + + @Override + protected void tearDown() throws Exception { + matcher = null; + super.tearDown(); + } + + public void testEmptyPrefix() { + assertTrue(matcher.isCandidateMatchingPrefix("name", "")); + assertTrue(matcher.isCandidateMatchingPrefix("", "")); + } + + public void testExactMatch() { + assertTrue(matcher.isCandidateMatchingPrefix("", "")); + assertTrue(matcher.isCandidateMatchingPrefix("Exact", "Exact")); + assertTrue(matcher.isCandidateMatchingPrefix("exact", "exact")); + assertTrue(matcher.isCandidateMatchingPrefix("eXact", "eXact")); + } + + public void testMisMatch() { + assertFalse(matcher.isCandidateMatchingPrefix("Exact", "Mismatch")); + assertFalse(matcher.isCandidateMatchingPrefix("Exact", "ExactMismatch")); + } + + public void testExactPrefix() { + assertTrue(matcher.isCandidateMatchingPrefix("Match", "")); + assertTrue(matcher.isCandidateMatchingPrefix("ExactMatch", "Exact")); + assertTrue(matcher.isCandidateMatchingPrefix("exactMatch", "exact")); + assertTrue(matcher.isCandidateMatchingPrefix("eXactMatch", "eXact")); + } + + public void testLowerCaseMatch() { + assertTrue(matcher.isCandidateMatchingPrefix("Exact", "exact")); + assertTrue(matcher.isCandidateMatchingPrefix("EXACT", "exact")); + assertTrue(matcher.isCandidateMatchingPrefix("exact", "exact")); + assertTrue(matcher.isCandidateMatchingPrefix("eXact", "exact")); + } + + public void testLowerCasePrefix() { + assertTrue(matcher.isCandidateMatchingPrefix("ExactMatch", "exact")); + assertTrue(matcher.isCandidateMatchingPrefix("EXACTMatch", "exact")); + assertTrue(matcher.isCandidateMatchingPrefix("exactMatch", "exact")); + assertTrue(matcher.isCandidateMatchingPrefix("eXactMatch", "exact")); + } + + public void testUpperCasePrefix() { + assertTrue(matcher.isCandidateMatchingPrefix("ExactMatch", "EXACT")); + assertTrue(matcher.isCandidateMatchingPrefix("EXACTMatch", "EXACT")); + assertTrue(matcher.isCandidateMatchingPrefix("exactMatch", "EXACT")); + assertTrue(matcher.isCandidateMatchingPrefix("eXactMatch", "EXACT")); + } + +} diff --git a/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/tests/AllUITests.java b/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/tests/AllUITests.java index f5603bb..36d7fed 100644 --- a/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/tests/AllUITests.java +++ b/tests/org.eclipse.xtext.ui.core.tests/src/org/eclipse/xtext/ui/core/tests/AllUITests.java @@ -23,6 +23,8 @@ public class AllUITests { // $JUnit-BEGIN$ suite.addTestSuite(ReplaceRegionTest.class); suite.addTestSuite(org.eclipse.xtext.ui.core.DefaultLabelProviderTest.class); + suite.addTestSuite(org.eclipse.xtext.ui.core.editor.contentassist.CamelCasePrefixMatcherTest.class); + suite.addTestSuite(org.eclipse.xtext.ui.core.editor.contentassist.IgnoreCasePrefixMatcherTest.class); // $JUnit-END$ return suite; } diff --git a/tests/org.eclipse.xtext.ui.integration.tests/src-gen/org/eclipse/xtext/ui/integration/AbstractTestLanguageUiModule.java b/tests/org.eclipse.xtext.ui.integration.tests/src-gen/org/eclipse/xtext/ui/integration/AbstractTestLanguageUiModule.java index 6fc39b4..151382a 100644 --- a/tests/org.eclipse.xtext.ui.integration.tests/src-gen/org/eclipse/xtext/ui/integration/AbstractTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.ui.integration.tests/src-gen/org/eclipse/xtext/ui/integration/AbstractTestLanguageUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractTestLanguageUiModule extends DefaultUIModule { } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.ui.integration.TestLanguageProposalProvider.class; } diff --git a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/AbstractXtextGrammarTestLanguageUiModule.java b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/AbstractXtextGrammarTestLanguageUiModule.java index 2493f7d..f860807 100644 --- a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/AbstractXtextGrammarTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/AbstractXtextGrammarTestLanguageUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractXtextGrammarTestLanguageUiModule extends DefaultUI } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.XtextGrammarTestLanguageProposalProvider.class; } diff --git a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/enumrules/AbstractEnumRulesTestLanguageUiModule.java b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/enumrules/AbstractEnumRulesTestLanguageUiModule.java index e875a72..4823169 100644 --- a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/enumrules/AbstractEnumRulesTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/enumrules/AbstractEnumRulesTestLanguageUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractEnumRulesTestLanguageUiModule extends DefaultUIMod } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.enumrules.EnumRulesTestLanguageProposalProvider.class; } diff --git a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/parser/keywords/AbstractKeywordsTestLanguageUiModule.java b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/parser/keywords/AbstractKeywordsTestLanguageUiModule.java index 3d8d9d9..14f0cec 100644 --- a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/parser/keywords/AbstractKeywordsTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/parser/keywords/AbstractKeywordsTestLanguageUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractKeywordsTestLanguageUiModule extends DefaultUIModu } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.parser.keywords.KeywordsTestLanguageProposalProvider.class; } diff --git a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractContentAssistTestLanguageUiModule.java b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractContentAssistTestLanguageUiModule.java index 4764e87..a04a36d 100644 --- a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractContentAssistTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractContentAssistTestLanguageUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractContentAssistTestLanguageUiModule extends DefaultU } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.testlanguages.ContentAssistTestLanguageProposalProvider.class; } diff --git a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractReferenceGrammarTestLanguageUiModule.java b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractReferenceGrammarTestLanguageUiModule.java index 93829c1..06aff72 100644 --- a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractReferenceGrammarTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractReferenceGrammarTestLanguageUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractReferenceGrammarTestLanguageUiModule extends Defau } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.testlanguages.ReferenceGrammarTestLanguageProposalProvider.class; } diff --git a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractTreeTestLanguageUiModule.java b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractTreeTestLanguageUiModule.java index fb5fcb4..c9e4657 100644 --- a/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractTreeTestLanguageUiModule.java +++ b/tests/org.eclipse.xtext.xtend.tests/src-gen/org/eclipse/xtext/testlanguages/AbstractTreeTestLanguageUiModule.java @@ -28,6 +28,11 @@ public abstract class AbstractTreeTestLanguageUiModule extends DefaultUIModule { } + public Class<? extends org.eclipse.xtext.ui.common.editor.contentassist.IProposalConflictHelper> bindIProposalConflictHelper() { + return org.eclipse.xtext.ui.common.editor.contentassist.antlr.AntlrProposalConflictHelper.class; + } + + public Class<? extends org.eclipse.xtext.ui.core.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() { return org.eclipse.xtext.testlanguages.TreeTestLanguageProposalProvider.class; } |

