/* * generated by Xtext 2.10.0 */ package org.etsi.mts.tdl.scoping; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.Scopes; import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider; import org.etsi.mts.tdl.DataInstance; import org.etsi.mts.tdl.DataInstanceUse; import org.etsi.mts.tdl.DataType; import org.etsi.mts.tdl.ElementImport; import org.etsi.mts.tdl.Package; import org.etsi.mts.tdl.PackageableElement; import org.etsi.mts.tdl.structuredobjectives.Entity; import org.etsi.mts.tdl.structuredobjectives.EntityReference; import org.etsi.mts.tdl.structuredobjectives.Event; import org.etsi.mts.tdl.structuredobjectives.EventReference; import org.etsi.mts.tdl.structuredobjectives.EventSpecificationTemplate; import org.etsi.mts.tdl.structuredobjectives.LiteralValue; /** * This class contains custom scoping description. * * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping * on how and when to use it. */ public class TPLan2ScopeProvider extends AbstractDeclarativeScopeProvider { @Override public IScope getScope(EObject context, EReference reference) { if (reference.getEType().getInstanceClass() == Event.class) { EList elements = getScopedElementsOfType(context, Event.class); return Scopes.scopeFor(elements); } else if (reference.getEType().getInstanceClass() == Entity.class) { EList elements = getScopedElementsOfType(context, Entity.class); return Scopes.scopeFor(elements); } else if (reference.getEType().getInstanceClass() == EventSpecificationTemplate.class) { EList elements = getScopedElementsOfType(context, EventSpecificationTemplate.class); return Scopes.scopeFor(elements); } return super.getScope(context, reference); } public IScope scope_ElementImport_importedElement(ElementImport context, EReference ref) { EList elements = new BasicEList<>(); Package ip = context.getImportedPackage(); for (PackageableElement e : ip.getPackagedElement()) { elements.add(e); } IScope scope = Scopes.scopeFor(elements); return scope; } public IScope scope_EventReference_event(EventReference context, EReference ref) { EList elements = getScopedElementsOfType(context, Event.class); IScope scope = Scopes.scopeFor(elements); return scope; } public IScope scope_EntityReference_entity(EntityReference context, EReference ref) { EList elements = getScopedElementsOfType(context, Entity.class); IScope scope = Scopes.scopeFor(elements); return scope; } public IScope scope_DataInstanceUse_dataInstance(DataInstanceUse context, EReference ref) { EList elements = getScopedElementsOfType(context, DataInstance.class); IScope scope = Scopes.scopeFor(elements); return scope; } public IScope scope_LiteralValue_dataType(LiteralValue context, EReference ref) { EList elements = getScopedElementsOfType(context, DataType.class); IScope scope = Scopes.scopeFor(elements); return scope; } private Package getPackage(EObject e) { if (e.eContainer() instanceof Package) { return (Package)e.eContainer(); } else { return getPackage(e.eContainer()); } } private EList getScopedElementsOfType(EObject context, Class c) { EList elements = new BasicEList<>(); Package p = getPackage(context); //within same package for (PackageableElement e : p.getPackagedElement()) { if (c.isInstance(e)) { elements.add(e); } } //within imported packages for (ElementImport i : p.getImport()) { Package ip = i.getImportedPackage(); if (i.getImportedElement().isEmpty()) { //import all for (PackageableElement e : ip.getPackagedElement()) { if (c.isInstance(e)) { elements.add(e); } } } else { //specific imports for (PackageableElement e : i.getImportedElement()) { if (c.isInstance(e)) { elements.add(e); } } } } return elements; } }