package org.xtest.generator.contentassist; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.xpand2.XpandExecutionContext; import org.eclipse.xtext.AbstractRule; import org.eclipse.xtext.EcoreUtil2; import org.eclipse.xtext.Grammar; import org.eclipse.xtext.ui.generator.contentAssist.JavaBasedContentAssistFragment; import com.google.common.collect.Lists; /** * Custom content assist fragment that has additional dontOverrideMethods field that when set to * true stops the generator from creating methods in the abstract content assist proposal provider * that would override those from a superclass. * * @author Michael Barry */ public class XtestContentAssistFragment extends JavaBasedContentAssistFragment { private static final Logger logger = Logger.getLogger(XtestContentAssistFragment.class); private boolean dontOverrideMethods = false; @Override public void generate(Grammar grammar, XpandExecutionContext ctx) { if (dontOverrideMethods) { Grammar grammar2 = EcoreUtil2.clone(grammar); List<AbstractRule> toRemove = gatherRulesToRemove(grammar2, grammar2.getUsedGrammars()); grammar2.getRules().removeAll(toRemove); grammar = grammar2; } super.generate(grammar, ctx); } /** * Returns the value of the don't override flag * * @return The value of the don't override flag */ public boolean isDontOverrideMethods() { return dontOverrideMethods; } /** * Sets the don't override flag that stops the generator from creating methods in the abstract * content assist proposal provider that would override those from a superclass. <br> * <br> * This flag is false by default. * * @param dontOverrideMethods * The new value for the don't override flag */ public void setDontOverrideMethods(boolean dontOverrideMethods) { this.dontOverrideMethods = dontOverrideMethods; } @Override protected String getTemplate() { return JavaBasedContentAssistFragment.class.getName().replaceAll("\\.", "::"); } private List<AbstractRule> gatherRulesToRemove(Grammar grammar2, List<Grammar> used) { List<AbstractRule> result = Lists.newArrayList(); for (Grammar other : used) { result.addAll(gatherRulesToRemove(grammar2, other.getUsedGrammars())); for (AbstractRule rule : other.getRules()) { for (AbstractRule rule2 : grammar2.getRules()) { if (rule2.getName().equals(rule.getName())) { result.add(rule2); logger.info("Skipping content assist generation for " + rule.getName()); } } } } return result; } }