Browse Source

Merge pull request #392 from Yakindu/issue_387

resolves #387
Thomas Kutz 9 years ago
parent
commit
1f466f3268

+ 19 - 5
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/STextScopeProvider.java

@@ -37,6 +37,8 @@ import org.yakindu.base.expressions.expressions.FeatureCall;
 import org.yakindu.base.types.ComplexType;
 import org.yakindu.base.types.Declaration;
 import org.yakindu.base.types.EnumerationType;
+import org.yakindu.base.types.Type;
+import org.yakindu.base.types.TypeAlias;
 import org.yakindu.base.types.TypesPackage;
 import org.yakindu.base.xtext.utils.jface.viewers.ContextElementAdapter;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
@@ -153,8 +155,7 @@ public class STextScopeProvider extends AbstractDeclarativeScopeProvider {
 		}
 
 		if (element instanceof ComplexType) {
-			scope = Scopes.scopeFor(((ComplexType) element).getAllFeatures(), scope);
-			scope = new FilteringScope(scope, predicate);
+			scope = addScopeForComplexType((ComplexType) element, scope, predicate);
 		}
 
 		if (element instanceof EnumerationType) {
@@ -162,11 +163,24 @@ public class STextScopeProvider extends AbstractDeclarativeScopeProvider {
 			// scope = new FilteringScope(scope, predicate);
 		}
 
-		if (element instanceof Declaration && ((Declaration) element).getType() instanceof ComplexType) {
-			scope = Scopes.scopeFor(((ComplexType) ((Declaration) element).getType()).getAllFeatures(), scope);
-			scope = new FilteringScope(scope, predicate);
+		if (element instanceof Declaration) {
+			Declaration decl = (Declaration) element;
+			if (decl.getType() instanceof ComplexType) {
+				scope = addScopeForComplexType((ComplexType) decl.getType(), scope, predicate);
+			} else if (decl.getType() instanceof TypeAlias) {
+				Type originType = ((TypeAlias) decl.getType()).getOriginType();
+				if (originType instanceof ComplexType) {
+					scope = addScopeForComplexType((ComplexType) originType, scope, predicate);
+				}
+			}
 		}
+		
+		return scope;
+	}
 
+	protected IScope addScopeForComplexType(final ComplexType type, IScope scope, final Predicate<IEObjectDescription> predicate) {
+		scope = Scopes.scopeFor(type.getAllFeatures(), scope);
+		scope = new FilteringScope(scope, predicate);
 		return scope;
 	}
 

+ 45 - 6
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/util/STextTestScopeProvider.java

@@ -13,13 +13,23 @@ package org.yakindu.sct.model.stext.test.util;
 import java.util.HashMap;
 import java.util.List;
 
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.resource.EObjectDescription;
 import org.eclipse.xtext.resource.IEObjectDescription;
 import org.eclipse.xtext.scoping.IScope;
 import org.eclipse.xtext.scoping.impl.SimpleScope;
+import org.yakindu.base.types.ComplexType;
+import org.yakindu.base.types.Property;
+import org.yakindu.base.types.Type;
+import org.yakindu.base.types.TypesFactory;
+import org.yakindu.base.types.typesystem.GenericTypeSystem;
+import org.yakindu.base.types.typesystem.ITypeSystem;
 import org.yakindu.sct.model.sgraph.Region;
 import org.yakindu.sct.model.sgraph.SGraphFactory;
 import org.yakindu.sct.model.sgraph.State;
@@ -41,18 +51,31 @@ public class STextTestScopeProvider extends STextScopeProvider {
 	@Inject
 	private IQualifiedNameProvider qfnProvider;
 
+	@Inject
+	private ITypeSystem typeSystem;
+
 	public IScope getScope(EObject context, EReference reference) {
 		IScope parentScope = super.getScope(context, reference);
 
+		List<IEObjectDescription> descriptions = Lists.newArrayList(parentScope.getAllElements());
+
 		State dummyState = createDummyModel();
-		IEObjectDescription desc = new EObjectDescription(
-				qfnProvider.getFullyQualifiedName(dummyState), dummyState,
-				new HashMap<String, String>());
-		List<IEObjectDescription> descriptions = Lists.newArrayList(parentScope
-				.getAllElements());
-		descriptions.add(desc);
+		descriptions.add(createEObjectDesc(dummyState));
+
+		Type complexType = createComplexType();
+		descriptions.add(createEObjectDesc(complexType));
+
+		TreeIterator<EObject> iterator = complexType.eAllContents();
+		while (iterator.hasNext()) {
+			EObject content = iterator.next();
+			descriptions.add(createEObjectDesc(content));
+		}
+
 		return new SimpleScope(descriptions);
+	}
 
+	private IEObjectDescription createEObjectDesc(EObject object) {
+		return new EObjectDescription(qfnProvider.getFullyQualifiedName(object), object, new HashMap<String, String>());
 	}
 
 	private State createDummyModel() {
@@ -67,4 +90,20 @@ public class STextTestScopeProvider extends STextScopeProvider {
 		return state;
 	}
 
+	private ComplexType createComplexType() {
+		ComplexType complexType = TypesFactory.eINSTANCE.createComplexType();
+		complexType.setName("ComplexType");
+
+		Property featureX = TypesFactory.eINSTANCE.createProperty();
+		featureX.setName("x");
+		featureX.setType(typeSystem.getType(GenericTypeSystem.INTEGER));
+		complexType.getFeatures().add(featureX);
+
+		typeSystem.declareType(complexType, complexType.getName());
+		Resource resource = new ResourceImpl(URI.createURI("types2"));
+		resource.getContents().add(complexType);
+
+		return complexType;
+	}
+
 }

+ 37 - 1
test-plugins/org.yakindu.sct.simulation.core.sexec.test/src/org/yakindu/sct/model/sexec/interpreter/test/STextInterpreterTest.java

@@ -31,9 +31,11 @@ import org.yakindu.sct.model.sgraph.Scope;
 import org.yakindu.sct.model.stext.test.util.AbstractSTextTest;
 import org.yakindu.sct.model.stext.test.util.STextInjectorProvider;
 import org.yakindu.sct.simulation.core.sexec.interpreter.IStatementInterpreter;
+import org.yakindu.sct.simulation.core.sruntime.CompositeSlot;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionContext;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionEvent;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable;
+import org.yakindu.sct.simulation.core.sruntime.impl.CompositeSlotImpl;
 import org.yakindu.sct.simulation.core.sruntime.impl.ExecutionEventImpl;
 import org.yakindu.sct.simulation.core.sruntime.impl.ExecutionVariableImpl;
 
@@ -470,12 +472,34 @@ public class STextInterpreterTest extends AbstractSTextTest {
 	public void testEnumEqualsExpression() {
 		assertEquals(true, execute("internal: var enumVar : EnumType", "enumVar == EnumType.A"));
 	}
-	
+
 	@Test
 	public void testEnumAssignment() {
 		execute("internal: var enumVar : EnumType", "enumVar = EnumType.A");
 		assertEquals(((EnumerationType)typeSystem.getType("EnumType")).getEnumerator().get(0), getEnumValue());
 	}
+	
+	@Test
+	public void testComplexTypeEqualsExpression() {
+		assertEquals(true, execute("internal: var cpVar : ComplexType", "cpVar.x == 0"));
+	}
+	
+	@Test
+	public void testComplexTypeAssignment() {
+		execute("internal: var cpVar : ComplexType", "cpVar.x = 42");
+		assertEquals(42L, context.getVariable("cpVar.x").getValue());
+	}
+	
+	@Test
+	public void testEqualsExpressionForComplexTypeAlias() {
+		assertEquals(true, execute("internal: alias MyComplexType : ComplexType var cpVar : MyComplexType", "cpVar.x == 0"));
+	}
+	
+	@Test
+	public void testAssignmentToComplexTypeAlias() {
+		execute("internal: alias MyComplexType : ComplexType var cpVar : MyComplexType", "cpVar.x = 42");
+		assertEquals(42L, context.getVariable("cpVar.x").getValue());
+	}
 
 	// Convenience...
 
@@ -528,6 +552,18 @@ public class STextInterpreterTest extends AbstractSTextTest {
 		enumVar.setType(enumType);
 		enumVar.setValue(enumType.getEnumerator().get(0));
 		context.getSlots().add(enumVar);
+		
+		CompositeSlot cpVar = new CompositeSlotImpl();
+		cpVar.setName("cpVar");
+		cpVar.setFqName("cpVar");
+		
+		ExecutionVariable featureVar = new ExecutionVariableImpl();
+		featureVar.setName("x");
+		featureVar.setFqName("cpVar.x");
+		featureVar.setType(typeSystem.getType(GenericTypeSystem.INTEGER));
+		featureVar.setValue(0);
+		cpVar.getSlots().add(featureVar);
+		context.getSlots().add(cpVar);
 	}
 	
 	private EnumerationType createEnumType() {