Program: SubPrograms+=NamedElement*; NamedElement: Type | Interface; Type: 'type' name=ID; Interface:'interface' name=ID ('offers' interfaces=JvmTypeReference)?;
def dispatch void infer(Program program, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) { acceptor.accept(program.toClass("Main"))[ packageName = "main" program.subPrograms.forEach[ namedElement | if(namedElement instanceof Interface){ members+= namedElement.toInterface(namedElement.name,[ interface = true if(namedElement.interfaces!= null){ superTypes += namedElement.interfaces.cloneWithProxies } ]) } // Types are nested static classes if(namedElement instanceof Type){ members+=namedElement.toClass(namedElement.name,[ static = true ]) } ] ] }
class MyDsl2ProposalProvider extends AbstractMyDsl2ProposalProvider { override completeInterface_Interfaces(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val filter = createVisibilityFilter(context, IJavaSearchConstants.INTERFACE) completeJavaTypes(context, TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE, filter, acceptor) } }
type myType interface i1 interface i2 offers Main$<ctrl+space>
import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.search.IJavaSearchConstants; import org.eclipse.xtext.common.types.xtext.ui.ITypesProposalProvider.Filter; import org.eclipse.xtext.common.types.xtext.ui.TypeMatchFilters; import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext; public class VisibilityFilter2 extends TypeMatchFilters.AbstractFilter { private Filter delegate; private int searchFor; public VisibilityFilter2(ContentAssistContext context, int searchFor) { this.searchFor = searchFor; delegate = TypeMatchFilters.and(TypeMatchFilters.isNotInternal(searchFor), TypeMatchFilters.isAcceptableByPreference()); } @Override public boolean accept(int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) { if (delegate.accept(modifiers, packageName, simpleTypeName, enclosingTypeNames, path)) { if (searchFor == IJavaSearchConstants.INTERFACE) { return Flags.isInterface(modifiers); } return true; } return false; } }