Parcourir la source

Merge pull request #964 from Yakindu/arrays_pointers_2

merged array_pointers branch with master
Andreas Mülder il y a 9 ans
Parent
commit
f540e99053
14 fichiers modifiés avec 110 ajouts et 58 suppressions
  1. 1 0
      plugins/org.yakindu.base.types/model/types.ecore
  2. 8 0
      plugins/org.yakindu.base.types/src-gen/org/yakindu/base/types/ArrayTypeSpecifier.java
  3. 10 0
      plugins/org.yakindu.base.types/src-gen/org/yakindu/base/types/impl/ArrayTypeSpecifierImpl.java
  4. 2 0
      plugins/org.yakindu.base.types/src-gen/org/yakindu/base/types/impl/TypesPackageImpl.java
  5. 26 10
      plugins/org.yakindu.base.types/src/org/yakindu/base/types/annotations/TypeAnnotations.java
  6. 6 2
      plugins/org.yakindu.base.types/src/org/yakindu/base/types/typesystem/AbstractTypeSystem.java
  7. 1 1
      plugins/org.yakindu.base.types/src/org/yakindu/base/types/typesystem/ITypeSystem.java
  8. 1 1
      plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/DomainRegistry.java
  9. 7 0
      plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/expressions/STextExpressionParser.java
  10. 2 4
      plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/STextGlobalScopeProvider.java
  11. 3 7
      plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java
  12. 39 31
      plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/DefaultExecutionSlotResolver.xtend
  13. 2 1
      test-plugins/org.yakindu.sct.model.stext.test/META-INF/MANIFEST.MF
  14. 2 1
      test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/util/STextInjectorProvider.java

+ 1 - 0
plugins/org.yakindu.base.types/model/types.ecore

@@ -103,6 +103,7 @@
         eType="#//Annotation"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ArrayTypeSpecifier" eSuperTypes="#//TypeSpecifier">
+    <eOperations name="getElementType" eType="#//Type"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="size" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
   </eClassifiers>
 </ecore:EPackage>

+ 8 - 0
plugins/org.yakindu.base.types/src-gen/org/yakindu/base/types/ArrayTypeSpecifier.java

@@ -46,4 +46,12 @@ public interface ArrayTypeSpecifier extends TypeSpecifier {
 	 */
 	void setSize(int value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation"
+	 * @generated
+	 */
+	Type getElementType();
+
 } // ArrayTypeSpecifier

+ 10 - 0
plugins/org.yakindu.base.types/src-gen/org/yakindu/base/types/impl/ArrayTypeSpecifierImpl.java

@@ -9,6 +9,7 @@ import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.yakindu.base.types.ArrayTypeSpecifier;
+import org.yakindu.base.types.Type;
 import org.yakindu.base.types.TypesPackage;
 
 /**
@@ -85,6 +86,15 @@ public class ArrayTypeSpecifierImpl extends TypeSpecifierImpl implements ArrayTy
 			eNotify(new ENotificationImpl(this, Notification.SET, TypesPackage.ARRAY_TYPE_SPECIFIER__SIZE, oldSize, size));
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated NOT
+	 */
+	public Type getElementType() {
+		return getTypeArguments().get(0).getType();
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->

+ 2 - 0
plugins/org.yakindu.base.types/src-gen/org/yakindu/base/types/impl/TypesPackageImpl.java

@@ -1008,6 +1008,8 @@ public class TypesPackageImpl extends EPackageImpl implements TypesPackage {
 		initEClass(arrayTypeSpecifierEClass, ArrayTypeSpecifier.class, "ArrayTypeSpecifier", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getArrayTypeSpecifier_Size(), ecorePackage.getEInt(), "size", null, 0, 1, ArrayTypeSpecifier.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		addEOperation(arrayTypeSpecifierEClass, this.getType(), "getElementType", 0, 1, IS_UNIQUE, IS_ORDERED);
+
 		// Initialize enums and add enum literals
 		initEEnum(directionEEnum, Direction.class, "Direction");
 		addEEnumLiteral(directionEEnum, Direction.LOCAL);

+ 26 - 10
plugins/org.yakindu.base.types/src/org/yakindu/base/types/annotations/TypeAnnotations.java

@@ -1,3 +1,14 @@
+/**
+ * Copyright (c) 2016 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+
 package org.yakindu.base.types.annotations;
 
 import org.yakindu.base.types.AnnotatableElement;
@@ -7,32 +18,37 @@ import org.yakindu.base.types.TypesFactory;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 
+/**
+ * @author Thomas Kutz - Initial contribution and API
+ * 
+ */
+
 public class TypeAnnotations {
-	
+
 	private static final String INDEX_OPERATION = "IndexOperation";
 	private static final String BUILT_IN_TYPE = "Built-In-Type";
 
-	public static Annotation createBuiltInTypeAnnotation() {
+	public Annotation createBuiltInTypeAnnotation() {
 		Annotation builtInAnnotation = TypesFactory.eINSTANCE.createAnnotation();
 		builtInAnnotation.setName(BUILT_IN_TYPE);
 		return builtInAnnotation;
 	}
-	
-	public static boolean hasBuiltInTypeAnnotation(AnnotatableElement element) {
+
+	public boolean hasBuiltInTypeAnnotation(AnnotatableElement element) {
 		return hasAnnotation(element, BUILT_IN_TYPE);
 	}
-	
-	public static Annotation createIndexOperationAnnotation() {
+
+	public Annotation createIndexOperationAnnotation() {
 		Annotation indexAnnotation = TypesFactory.eINSTANCE.createAnnotation();
 		indexAnnotation.setName(INDEX_OPERATION);
 		return indexAnnotation;
 	}
-	
-	public static boolean hasIndexOperationAnnotation(AnnotatableElement element) {
+
+	public boolean hasIndexOperationAnnotation(AnnotatableElement element) {
 		return hasAnnotation(element, INDEX_OPERATION);
 	}
 
-	public static boolean hasAnnotation(final AnnotatableElement element, final String name) {
+	public boolean hasAnnotation(final AnnotatableElement element, final String name) {
 		return Iterables.any(element.getAnnotations(), new Predicate<Annotation>() {
 			@Override
 			public boolean apply(Annotation input) {
@@ -40,5 +56,5 @@ public class TypeAnnotations {
 			}
 		});
 	}
-	
+
 }

+ 6 - 2
plugins/org.yakindu.base.types/src/org/yakindu/base/types/typesystem/AbstractTypeSystem.java

@@ -26,6 +26,7 @@ import org.yakindu.base.types.ComplexType;
 import org.yakindu.base.types.PrimitiveType;
 import org.yakindu.base.types.Type;
 import org.yakindu.base.types.TypesFactory;
+import org.yakindu.base.types.annotations.TypeAnnotations;
 
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
@@ -46,9 +47,12 @@ public abstract class AbstractTypeSystem implements ITypeSystem {
 	protected abstract void initBuiltInTypes();
 
 	protected Resource resource;
+	
+	protected TypeAnnotations typeAnnotations;
 
 	public AbstractTypeSystem() {
 		resource = new ResourceImpl(URI.createURI("types"));
+		typeAnnotations = new TypeAnnotations();
 		initBuiltInTypes();
 	}
 
@@ -219,7 +223,7 @@ public abstract class AbstractTypeSystem implements ITypeSystem {
 	}
 	
 	@Override
-	public boolean isArrayType(Type type) {
-		return false;
+	public boolean isBuiltInType(Type type) {
+		return typeAnnotations.hasBuiltInTypeAnnotation(type);
 	}
 }

+ 1 - 1
plugins/org.yakindu.base.types/src/org/yakindu/base/types/typesystem/ITypeSystem.java

@@ -51,6 +51,6 @@ public interface ITypeSystem {
 
 	public boolean isSuperType(Type subtype, Type supertype);
 	
-	public boolean isArrayType(Type type);
+	public boolean isBuiltInType(Type type);
 
 }

+ 1 - 1
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/DomainRegistry.java

@@ -47,7 +47,7 @@ public class DomainRegistry {
 	private static final String DOMAIN_EXTENSION_POINT_ID = "org.yakindu.sct.domain";
 	private static final String MODULES_EXTENSION_POINT_ID = "org.yakindu.sct.domain.modules";
 
-	private static final String DOMAIN_ID = "domainID";
+	public static final String DOMAIN_ID = "domainID";
 	private static final String DESCRIPTION = "description";
 	private static final String IMAGE = "image";
 	private static final String NAME = "name";

+ 7 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/expressions/STextExpressionParser.java

@@ -27,6 +27,7 @@ import org.eclipse.xtext.parser.IParseResult;
 import org.eclipse.xtext.parser.IParser;
 import org.eclipse.xtext.resource.impl.ListBasedDiagnosticConsumer;
 import org.eclipse.xtext.util.CancelIndicator;
+import org.yakindu.sct.domain.extension.DomainRegistry;
 import org.yakindu.sct.model.sgraph.SGraphFactory;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.Scope;
@@ -40,6 +41,7 @@ import org.yakindu.sct.model.stext.stext.InternalScope;
 import com.google.common.collect.Multimap;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
+import com.google.inject.name.Named;
 
 public class STextExpressionParser implements IExpressionParser {
 
@@ -62,6 +64,10 @@ public class STextExpressionParser implements IExpressionParser {
 	private ILinker linker;
 	@Inject
 	private Injector injector;
+	
+	@Inject
+	@Named(DomainRegistry.DOMAIN_ID)
+	private String domainId;
 
 	public StextResource getResource() {
 		final StextResource resource = new StextResource();
@@ -90,6 +96,7 @@ public class STextExpressionParser implements IExpressionParser {
 		resource.getContents().add(rootASTElement);
 		ListBasedDiagnosticConsumer diagnosticsConsumer = new ListBasedDiagnosticConsumer();
 		Statechart sc = SGraphFactory.eINSTANCE.createStatechart();
+		sc.setDomainID(domainId);
 		sc.setName("sc");
 		if (specification != null) {
 			sc.setSpecification(specification);

+ 2 - 4
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/STextGlobalScopeProvider.java

@@ -21,6 +21,7 @@ import org.eclipse.xtext.scoping.IScope;
 import org.eclipse.xtext.scoping.impl.DefaultGlobalScopeProvider;
 import org.eclipse.xtext.scoping.impl.FilteringScope;
 import org.yakindu.base.types.typesystem.ITypeSystem;
+import org.yakindu.sct.domain.extension.DomainRegistry;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.util.ContextElementAdapter;
@@ -34,11 +35,8 @@ import com.google.inject.Inject;
  */
 public class STextGlobalScopeProvider extends DefaultGlobalScopeProvider {
 
-	private static final String DOMAIN_ID = "domainId";
-
 	@Inject
 	private ITypeSystem typeSystem;
-
 	@Inject
 	private IQualifiedNameProvider qualifiedNameProvider;
 
@@ -53,7 +51,7 @@ public class STextGlobalScopeProvider extends DefaultGlobalScopeProvider {
 		return new FilteringScope(parentScope, new Predicate<IEObjectDescription>() {
 			@Override
 			public boolean apply(IEObjectDescription input) {
-				String userData = input.getUserData(DOMAIN_ID);
+				String userData = input.getUserData(DomainRegistry.DOMAIN_ID);
 				if (userData == null)
 					return true;
 				return statechart.getDomainID().equals(userData);

+ 3 - 7
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java

@@ -56,6 +56,7 @@ import org.yakindu.base.types.Property;
 import org.yakindu.base.types.TypesPackage;
 import org.yakindu.base.types.annotations.TypeAnnotations;
 import org.yakindu.base.types.inferrer.ITypeSystemInferrer;
+import org.yakindu.sct.domain.extension.DomainRegistry;
 import org.yakindu.sct.model.sgraph.Choice;
 import org.yakindu.sct.model.sgraph.Entry;
 import org.yakindu.sct.model.sgraph.Exit;
@@ -124,7 +125,7 @@ public class STextJavaValidator extends AbstractSTextJavaValidator implements ST
 	@Inject
 	private ImportResolver resolver;
 	@Inject(optional = true)
-	@Named("domainId")
+	@Named(DomainRegistry.DOMAIN_ID)
 	private String domainID = BasePackage.Literals.DOMAIN_ELEMENT__DOMAIN_ID.getDefaultValueLiteral();
 
 	@Check
@@ -216,12 +217,7 @@ public class STextJavaValidator extends AbstractSTextJavaValidator implements ST
 		Expression varRef = expression.getVarRef();
 		if (varRef instanceof FeatureCall) {
 			EObject referencedObject = ((FeatureCall) varRef).getFeature();
-			if (referencedObject instanceof Operation) {
-				if (!TypeAnnotations.hasIndexOperationAnnotation((Operation)referencedObject)) {
-					error(LEFT_HAND_ASSIGNMENT, ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__VAR_REF);
-				}
-			}
-			else if (!(referencedObject instanceof Property)) {
+		 if (!(referencedObject instanceof Property)) {
 				error(LEFT_HAND_ASSIGNMENT, ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__VAR_REF);
 			}
 		} else if (varRef instanceof ElementReferenceExpression) {

+ 39 - 31
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/DefaultExecutionSlotResolver.xtend

@@ -11,23 +11,22 @@
 package org.yakindu.sct.simulation.core.sexec.interpreter
 
 import com.google.inject.Inject
-import java.util.List
+import java.util.Stack
 import org.eclipse.emf.ecore.EObject
 import org.eclipse.xtext.EcoreUtil2
 import org.eclipse.xtext.naming.IQualifiedNameProvider
 import org.eclipse.xtext.util.SimpleAttributeResolver
+import org.yakindu.base.base.NamedElement
 import org.yakindu.base.expressions.expressions.AssignmentExpression
 import org.yakindu.base.expressions.expressions.ElementReferenceExpression
 import org.yakindu.base.expressions.expressions.FeatureCall
 import org.yakindu.base.types.Event
-import org.yakindu.base.types.Operation
 import org.yakindu.base.types.Package
 import org.yakindu.base.types.Property
 import org.yakindu.sct.model.stext.stext.InterfaceScope
 import org.yakindu.sct.simulation.core.sruntime.CompositeSlot
 import org.yakindu.sct.simulation.core.sruntime.ExecutionContext
 import org.yakindu.sct.simulation.core.sruntime.ExecutionSlot
-import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable
 
 /**
  * Default implementation for resolving execution slots based on expressions.
@@ -38,7 +37,7 @@ import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable
 class DefaultExecutionSlotResolver implements IExecutionSlotResolver {
 
 	@Inject
-	extension IQualifiedNameProvider nameProvider
+	protected extension IQualifiedNameProvider nameProvider
 
 	def dispatch ExecutionSlot resolve(ExecutionContext context, FeatureCall e) {		
 		return resolveByFeature(context, e, e.feature)		
@@ -52,10 +51,8 @@ class DefaultExecutionSlotResolver implements IExecutionSlotResolver {
 		return context.resolve(e.varRef)
 	}
 	
-	
 	def dispatch ExecutionSlot resolveByFeature(ExecutionContext context, FeatureCall e, EObject feature){
 		return context.getVariable(e.feature.fullyQualifiedName.toString)
-
 	}
 	
 	def dispatch ExecutionSlot resolveByFeature(ExecutionContext context, FeatureCall e, Event feature){
@@ -69,41 +66,53 @@ class DefaultExecutionSlotResolver implements IExecutionSlotResolver {
 	
 	def ExecutionSlot resolveCompositeSlot(ExecutionContext context, FeatureCall e){
 		var current = e
-		val List<EObject> calls = newArrayList
-		calls.add(0, e.feature)
+		val Stack<FeatureCall> callStack = new Stack
+		callStack.add(0, e)
 		while (!(current.owner instanceof ElementReferenceExpression)) {
 			current = current.owner as FeatureCall
-			calls.add(0, current.feature)
+			callStack.add(0, current)
 		}
-
-
-		// first: get the root slot where to start the search searching
+		// first: get the root slot where to start the search
 		val root = (current.owner as ElementReferenceExpression).reference
 		var ExecutionSlot featureSlot = null
 		
 		if (root instanceof InterfaceScope) {
-			featureSlot = context.getSlot(calls.get(0).fullyQualifiedName.toString)
-			calls.remove(0)
-		}
-		else {
+			featureSlot = context.getSlot(callStack.pop.feature.fullyQualifiedName.toString)
+		} else {
 			featureSlot = packageNamespaceAwareResolve(context, root)
-				if (featureSlot == null) {
-					return null // could not find starting slot for feature call
-			}	
+			if (featureSlot == null) {
+				return null // could not find starting slot for feature call
+			}
 		}
 		// go through all calls and traverse execution context hierarchy accordingly
-		for (EObject feature : calls) {
-
-			if (featureSlot instanceof CompositeSlot && (feature instanceof Property || feature instanceof Event)) {
-				featureSlot = (featureSlot as CompositeSlot).slots.findFirst[slot|slot.name == feature.name]
-			}
-			if (featureSlot instanceof ExecutionVariable && feature instanceof Operation) {
-				//					TODO (featureSlot as ExecutionVariable).value
-			}
+		for (FeatureCall call : callStack) {
+			featureSlot = resolveFromSlot(featureSlot, call)
 		}
-		
 		return featureSlot
-		
+	}
+	
+	def protected dispatch ExecutionSlot resolveFromSlot(ExecutionSlot slot, FeatureCall call) {
+		slot // fallback
+	}
+	
+	def protected dispatch ExecutionSlot resolveFromSlot(CompositeSlot slot, FeatureCall call) {
+		resolveByFeature(slot, call.feature)
+	}
+	
+	def protected dispatch ExecutionSlot resolveByFeature(CompositeSlot slot, EObject feature) {
+		slot // fallback
+	}
+	
+	def protected dispatch ExecutionSlot resolveByFeature(CompositeSlot slot, Property feature) {
+		resolveByName(slot, feature)
+	}
+	
+	def protected dispatch ExecutionSlot resolveByFeature(CompositeSlot slot, Event feature) {
+		resolveByName(slot, feature)
+	}
+	
+	def protected ExecutionSlot resolveByName(CompositeSlot slot, NamedElement element) {
+		slot.slots.findFirst[name == element.name]
 	}
 	
 	def protected ExecutionSlot packageNamespaceAwareResolve(ExecutionContext context, EObject element) {
@@ -115,9 +124,8 @@ class DefaultExecutionSlotResolver implements IExecutionSlotResolver {
 			context.getSlot(element.fullyQualifiedName.toString)
 		}
 	}
-	
 
 	def protected name(EObject e) {
 		return SimpleAttributeResolver::NAME_RESOLVER.apply(e)
 	}
-}
+}

+ 2 - 1
test-plugins/org.yakindu.sct.model.stext.test/META-INF/MANIFEST.MF

@@ -20,7 +20,8 @@ Require-Bundle: org.eclipse.xtext.junit4,
  org.yakindu.sct.simulation.core.sexec,
  org.yakindu.sct.simulation.core,
  org.yakindu.base.expressions,
- org.yakindu.sct.domain.generic
+ org.yakindu.sct.domain.generic,
+ org.yakindu.sct.domain
 Export-Package: org.yakindu.sct.model.stext.test,
  org.yakindu.sct.model.stext.test.util
 Import-Package: org.junit.runner;version="4.5.0",

+ 2 - 1
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/util/STextInjectorProvider.java

@@ -13,6 +13,7 @@ package org.yakindu.sct.model.stext.test.util;
 import org.eclipse.xtext.junit4.IInjectorProvider;
 import org.yakindu.base.base.BasePackage;
 import org.yakindu.base.types.inferrer.ITypeSystemInferrer;
+import org.yakindu.sct.domain.extension.DomainRegistry;
 import org.yakindu.sct.model.stext.inferrer.STextTypeInferrer;
 
 import com.google.inject.AbstractModule;
@@ -37,7 +38,7 @@ public class STextInjectorProvider implements IInjectorProvider {
 		return Modules.combine(new STextRuntimeTestModule(), new AbstractModule() {
 			@Override
 			protected void configure() {
-				bind(String.class).annotatedWith(Names.named("domainId"))
+				bind(String.class).annotatedWith(Names.named(DomainRegistry.DOMAIN_ID))
 						.toInstance(BasePackage.Literals.DOMAIN_ELEMENT__DOMAIN_ID.getDefaultValueLiteral());
 				bind(ITypeSystemInferrer.class).to(STextTypeInferrer.class);
 			}