Commit d1d454f8 authored by Martti Käärik's avatar Martti Käärik
Browse files

Separate context specific resolutions into methods to avoid using the wrong...

Separate context specific resolutions into methods to avoid using the wrong container object for TO elements.
parent 17ac8554
Loading
Loading
Loading
Loading
+35 −30
Original line number Diff line number Diff line
@@ -5,57 +5,56 @@ package org.etsi.mts.tdl.scoping;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

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.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.scoping.Scopes;
import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
import org.etsi.mts.tdl.DataInstanceUse;
import org.etsi.mts.tdl.DataUse;
import org.etsi.mts.tdl.Element;
import org.etsi.mts.tdl.ElementImport;
import org.etsi.mts.tdl.GateInstance;
import org.etsi.mts.tdl.GateReference;
import org.etsi.mts.tdl.MemberAssignment;
import org.etsi.mts.tdl.MemberReference;
import org.etsi.mts.tdl.NamedElement;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.PackageableElement;
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.ContentReference;
import org.etsi.mts.tdl.structuredobjectives.DataReference;
import org.etsi.mts.tdl.structuredobjectives.EventOccurrenceSpecification;
import org.etsi.mts.tdl.structuredobjectives.EventSequence;
import org.etsi.mts.tdl.structuredobjectives.LiteralValue;
import org.etsi.mts.tdl.structuredobjectives.LiteralValueReference;
import org.etsi.mts.tdl.structuredobjectives.StructuredTestObjective;
import org.etsi.mts.tdl.structuredobjectives.VariantBinding;

import com.google.common.base.Function;
import com.google.inject.Inject;

/**
 * This class contains custom scoping description.
 * 
 * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
 * See
 * https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
 * on how and when to use it.
 */
public class TPLan2ScopeProvider extends TDLScopeProvider {
	@Inject
	private IQualifiedNameConverter qualifiedNameConverter;

	public Iterator<EObject> getContainerContents(Element context) {
		if (context instanceof org.etsi.mts.tdl.structuredobjectives.Element) {
			StructuredTestObjective to = ((org.etsi.mts.tdl.structuredobjectives.Element) context).getTestObjective();
			if (to == null)
				return Collections.emptyIterator();
			return to.eAllContents();
		}
		return super.getContainerContents(context);
	}

	public List<? extends Parameter> getContainerParameters(Element context) {
		if (context instanceof org.etsi.mts.tdl.structuredobjectives.Element) {
			return new BasicEList<>();
		}
		return super.getContainerParameters(context);
	}

	@Override
	public IScope getScope(EObject context, EReference reference) {
//		if (PackageableElement.class.isAssignableFrom(reference.getEType().getInstanceClass())
@@ -69,12 +68,16 @@ public class TPLan2ScopeProvider extends TDLScopeProvider {
			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()).allMembers());
						IScope scope = Scopes
								.scopeFor(((StructuredDataType) ((LiteralValue) context.eContainer()).getDataType())
										.allMembers());
						return scope;
					}
				} else if (context.eContainer() instanceof Content) {
					if (((Content) context.eContainer()).getMember().getDataType() instanceof StructuredDataType) {
						IScope scope = Scopes.scopeFor(((StructuredDataType)((Content)context.eContainer()).getMember().getDataType()).allMembers());
						IScope scope = Scopes.scopeFor(
								((StructuredDataType) ((Content) context.eContainer()).getMember().getDataType())
										.allMembers());
						return scope;
					}
				}
@@ -85,10 +88,12 @@ public class TPLan2ScopeProvider extends TDLScopeProvider {
				StructuredTestObjective sto = EcoreUtil2.getContainerOfType(context, StructuredTestObjective.class);
				List<LiteralValue> literalValues = new ArrayList<>();
				if (sto.getInitialConditions() != null) {
					literalValues.addAll(EcoreUtil2.getAllContentsOfType(sto.getInitialConditions(), LiteralValue.class));
					literalValues
							.addAll(EcoreUtil2.getAllContentsOfType(sto.getInitialConditions(), LiteralValue.class));
				}
				if (sto.getExpectedBehaviour() != null) {
					literalValues.addAll(EcoreUtil2.getAllContentsOfType(sto.getExpectedBehaviour(), LiteralValue.class));
					literalValues
							.addAll(EcoreUtil2.getAllContentsOfType(sto.getExpectedBehaviour(), LiteralValue.class));
				}
				if (sto.getFinalConditions() != null) {
					literalValues.addAll(EcoreUtil2.getAllContentsOfType(sto.getFinalConditions(), LiteralValue.class));
+19 −7
Original line number Diff line number Diff line
package org.etsi.mts.tdl.scoping;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.emf.common.util.BasicEList;
@@ -17,7 +20,6 @@ import org.eclipse.xtext.scoping.Scopes;
import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
import org.etsi.mts.tdl.Action;
import org.etsi.mts.tdl.ActionReference;
import org.etsi.mts.tdl.Assignment;
import org.etsi.mts.tdl.Behaviour;
import org.etsi.mts.tdl.Block;
import org.etsi.mts.tdl.CollectionDataType;
@@ -89,6 +91,20 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider {
	@Inject
	private IQualifiedNameConverter qualifiedNameConverter;
	
	public Iterator<EObject> getContainerContents(Element context) {
		TestDescription td = context.getParentTestDescription();
		if (td == null)
			return Collections.emptyIterator();
		return td.eAllContents();
	}
	
	public List<? extends Parameter> getContainerParameters(Element context) {
		TestDescription td = context.getParentTestDescription();
		if (td == null)
			return Collections.emptyList();
		return td.getFormalParameter();
	}

	@Override
	public IScope getScope(EObject context, EReference reference) {
		//TODO: check problem
@@ -489,9 +505,8 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider {
				return scope;
			}
		} else if (context instanceof TimeLabelUse) {
			TestDescription testDescription = ((Element) context).getParentTestDescription();
			Set<TimeLabel> labels = new HashSet<TimeLabel>();
			testDescription.eAllContents().forEachRemaining(e -> {
			getContainerContents((Element) context).forEachRemaining(e -> {
				if (e instanceof TimeLabel)
					labels.add((TimeLabel) e);
			});
@@ -532,10 +547,7 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider {
		if (context instanceof DataElementUse) {
			EList<EObject> elements = new BasicEList<>();
			elements.addAll(getScopedElementsOfType(context, MappableDataElement.class));
			TestDescription testDescription = ((DataElementUse) context).getParentTestDescription();
			if (testDescription!=null) {
				elements.addAll(testDescription.getFormalParameter());
			}
			elements.addAll(getContainerParameters((Element) context));
//			elements.addAll(getScopedElementsOfType(context, FormalParameter.class));
//			elements.addAll(getScopedElementsOfType(context, StructuredDataType.class));
			return Scopes.scopeFor(elements);