Commit cba58ec5 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

* refined scoping for TO



Change-Id: I6b17b29278e6fb6d9a55b0713ff773b1d8402679
Signed-off-by: default avatarmakedonski <makedonski@informatik.uni-goettingen.de>
parent 3ccffc64
Loading
Loading
Loading
Loading
+54 −41
Original line number Diff line number Diff line
@@ -10,17 +10,18 @@ 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.DataUse;
import org.etsi.mts.tdl.ElementImport;
import org.etsi.mts.tdl.MemberAssignment;
import org.etsi.mts.tdl.MemberReference;
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.Parameter;
import org.etsi.mts.tdl.ParameterBinding;
import org.etsi.mts.tdl.StructuredDataInstance;
import org.etsi.mts.tdl.StructuredDataType;
import org.etsi.mts.tdl.structuredobjectives.Content;
import org.etsi.mts.tdl.structuredobjectives.LiteralValue;

/**
@@ -33,56 +34,68 @@ public class TPLan2ScopeProvider extends AbstractDeclarativeScopeProvider {
	
	@Override
	public IScope getScope(EObject context, EReference reference) {
		if (reference.getEType().getInstanceClass() == Event.class) {
			EList<EObject> elements = getScopedElementsOfType(context, Event.class);
			return Scopes.scopeFor(elements);
		} else if (reference.getEType().getInstanceClass() == Entity.class) {
			EList<EObject> elements = getScopedElementsOfType(context, Entity.class);
			return Scopes.scopeFor(elements);
		} else if (reference.getEType().getInstanceClass() == EventSpecificationTemplate.class) {
			EList<EObject> elements = getScopedElementsOfType(context, EventSpecificationTemplate.class);
		if (PackageableElement.class.isAssignableFrom(reference.getEType().getInstanceClass())
				&& !(context instanceof ElementImport)) {
			EList<EObject> elements = getScopedElementsOfType(context, reference.getEType().getInstanceClass());
			return Scopes.scopeFor(elements);
		} else if (Parameter.class.isAssignableFrom(reference.getEType().getInstanceClass())) {
			if (context instanceof MemberAssignment) {
				if (context.eContainer() instanceof StructuredDataInstance) {
					IScope scope = Scopes.scopeFor(((StructuredDataType)((StructuredDataInstance)context.eContainer()).getDataType()).getMember());
					return scope;
				}
		
		return super.getScope(context, reference);
			} else if (context instanceof ParameterBinding) {
				if (context.eContainer() instanceof DataInstanceUse) {
					if (((DataInstanceUse)context.eContainer()).getDataInstance() instanceof StructuredDataInstance) {
						IScope scope = Scopes.scopeFor(((StructuredDataType)((StructuredDataInstance)((DataInstanceUse)context.eContainer()).getDataInstance()).getDataType()).getMember());
						return scope;
					}
	
	public IScope scope_ElementImport_importedElement(ElementImport context, EReference ref) {
		EList<EObject> elements = new BasicEList<>();
		Package ip = context.getImportedPackage();
		for (PackageableElement e : ip.getPackagedElement()) {
			elements.add(e);
				}
		IScope scope = Scopes.scopeFor(elements);
			} else if (context instanceof MemberReference) {
				if (((DataUse)context.eContainer()).getReduction().indexOf(context)>0) {
					EObject targetContext = ((DataUse)context.eContainer()).getReduction().get(((DataUse)context.eContainer()).getReduction().indexOf(context)-1);
					if (((MemberReference)targetContext).getMember()!=null) {
						if (((MemberReference)targetContext).getMember().getDataType() instanceof StructuredDataType) {
							IScope scope = Scopes.scopeFor(((StructuredDataType)((MemberReference)targetContext).getMember().getDataType()).getMember());
							return scope;
						}

	
	public IScope scope_EventReference_event(EventReference context, EReference ref) {
		EList<EObject> elements = getScopedElementsOfType(context, Event.class);
		IScope scope = Scopes.scopeFor(elements);
					}
				} 
				if (context.eContainer() instanceof DataInstanceUse) {
					if (((DataInstanceUse)context.eContainer()).getDataInstance() instanceof StructuredDataInstance) {
						IScope scope = Scopes.scopeFor(((StructuredDataType)((StructuredDataInstance)((DataInstanceUse)context.eContainer()).getDataInstance()).getDataType()).getMember());
						return scope;
					}

	public IScope scope_EntityReference_entity(EntityReference context, EReference ref) {
		EList<EObject> elements = getScopedElementsOfType(context, Entity.class);
		IScope scope = Scopes.scopeFor(elements);
				}
			} else if (context instanceof Content) {
				if (context.eContainer() instanceof LiteralValue) {
					if (((LiteralValue)context.eContainer()).getDataType() instanceof StructuredDataType) {
						IScope scope = Scopes.scopeFor(((StructuredDataType)((LiteralValue)context.eContainer()).getDataType()).getMember());
						return scope;
					}

	public IScope scope_DataInstanceUse_dataInstance(DataInstanceUse context, EReference ref) {
		EList<EObject> elements = getScopedElementsOfType(context, DataInstance.class);
		IScope scope = Scopes.scopeFor(elements);
				} else if (context.eContainer() instanceof Content) {
					if (((Content)context.eContainer()).getMember().getDataType() instanceof StructuredDataType) {
						IScope scope = Scopes.scopeFor(((StructuredDataType)((Content)context.eContainer()).getMember().getDataType()).getMember());
						return scope;
					}
				}
			}
		} else {
		}
		
		return super.getScope(context, reference);
	}
	
	public IScope scope_LiteralValue_dataType(LiteralValue context, EReference ref) {
		EList<EObject> elements = getScopedElementsOfType(context, DataType.class);
	public IScope scope_ElementImport_importedElement(ElementImport context, EReference ref) {
		EList<EObject> elements = new BasicEList<>();
		Package ip = context.getImportedPackage();
		for (PackageableElement e : ip.getPackagedElement()) {
			elements.add(e);
		}
		IScope scope = Scopes.scopeFor(elements);
		return scope;
	}
	
	
	private Package getPackage(EObject e) {
		if (e.eContainer() instanceof Package) {
			return (Package)e.eContainer();