@Override
public IScope getScope(EObject context, EReference reference) {
// We want to define the Scope for the Element's superElement cross-reference
if (context instanceof Element
&& reference == MyDslPackage.Literals.ELEMENT__SUPER_ELEMENT) {
// Collect a list of candidates by going through the model
// EcoreUtil2 provides useful functionality to do that
// For example searching for all elements within the root Object's tree
EObject rootElement = EcoreUtil2.getRootContainer(context);
List<Element> candidates = EcoreUtil2.getAllContentsOfType(rootElement, Element.class);
// Create IEObjectDescriptions and puts them into an IScope instance
return Scopes.scopeFor(candidates);
}
return super.getScope(context, reference);
}
@Inject extension SmallJavaTypeProvider
def scope_SJMember(SJMemberSelection sel, EReference r) {
var parentScope = IScope::NULLSCOPE val type = sel.receiver.typeFor
if (type == null || type.isPrimitive) return parentScope
for (c : type.classHierarchy.reverseView) {
parentScope = Scopes::scopeFor(c.members, parentScope)
}
Scopes::scopeFor(type.members, parentScope) }