Przeglądaj źródła

Refactoring of ISTextTypeSystem and ISTextTypeInferrer

Andreas Mülder 12 lat temu
rodzic
commit
ad6e5cea10
16 zmienionych plików z 409 dodań i 510 usunięć
  1. 2 1
      plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/impl/StextResource.java
  2. 4 6
      plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/STextUiModule.java
  3. 4 5
      plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/SimulationModule.java
  4. 18 18
      plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/DefaultExecutionContextInitializer.xtend
  5. 20 31
      plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/Function.java
  6. 7 2
      plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/IOperationMockup.java
  7. 53 3
      plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/JavaOperationMockup.java
  8. 2 3
      plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/StextStatementInterpreter.xtend
  9. 1 2
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/ExecutionSlot.java
  10. 1 1
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/ExecutionContextImpl.java
  11. 0 3
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/ExecutionEventImpl.java
  12. 1 6
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/ExecutionSlotImpl.java
  13. 0 1
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/ExecutionVariableImpl.java
  14. 8 2
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/SRuntimeFactoryImpl.java
  15. 1 1
      plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/SRuntimePackageImpl.java
  16. 287 425
      test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/TypeInferrerTest.java

+ 2 - 1
plugins/org.yakindu.sct.model.stext.resource/src/org/yakindu/sct/model/stext/resource/impl/StextResource.java

@@ -85,7 +85,8 @@ public class StextResource extends AbstractSCTResource {
 		IParseResult parseResult = parse(statechart, StatechartSpecification.class.getSimpleName());
 		IParseResult parseResult = parse(statechart, StatechartSpecification.class.getSimpleName());
 
 
 		StatechartSpecification rootASTElement = (StatechartSpecification) parseResult.getRootASTElement();
 		StatechartSpecification rootASTElement = (StatechartSpecification) parseResult.getRootASTElement();
-
+		statechart.getImports().addAll(rootASTElement.getImports());
+		
 		EList<Scope> definitionScopes = rootASTElement.getScopes();
 		EList<Scope> definitionScopes = rootASTElement.getScopes();
 		statechart.getScopes().clear();
 		statechart.getScopes().clear();
 		statechart.setNamespace(rootASTElement.getNamespace());
 		statechart.setNamespace(rootASTElement.getNamespace());

+ 4 - 6
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/STextUiModule.java

@@ -1,6 +1,5 @@
 package org.yakindu.sct.model.stext.ui;
 package org.yakindu.sct.model.stext.ui;
 
 
-import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
 import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
 import org.eclipse.xtext.ui.editor.contentassist.antlr.ParserBasedContentAssistContextFactory.StatefulFactory;
 import org.eclipse.xtext.ui.editor.contentassist.antlr.ParserBasedContentAssistContextFactory.StatefulFactory;
@@ -24,7 +23,6 @@ import org.yakindu.sct.model.sgraph.ui.validation.SCTMarkerTypeProvider;
 import org.yakindu.sct.model.stext.ui.contentassist.STextStatefulFactory;
 import org.yakindu.sct.model.stext.ui.contentassist.STextStatefulFactory;
 import org.yakindu.sct.model.stext.ui.help.CustomCSSHelpHoverProvider;
 import org.yakindu.sct.model.stext.ui.help.CustomCSSHelpHoverProvider;
 import org.yakindu.sct.model.stext.ui.help.STextUserHelpDocumentationProvider;
 import org.yakindu.sct.model.stext.ui.help.STextUserHelpDocumentationProvider;
-import org.yakindu.sct.model.stext.ui.hyperlink.NullHyperlinkDetector;
 import org.yakindu.sct.model.stext.ui.validation.SCTDiagnosticConverterImpl;
 import org.yakindu.sct.model.stext.ui.validation.SCTDiagnosticConverterImpl;
 import org.yakindu.sct.model.stext.ui.validation.SCTResourceValidatorImpl;
 import org.yakindu.sct.model.stext.ui.validation.SCTResourceValidatorImpl;
 
 
@@ -89,10 +87,10 @@ public class STextUiModule extends
 				.toInstance("/StextHoverStyleSheet.css");
 				.toInstance("/StextHoverStyleSheet.css");
 	}
 	}
 
 
-	@Override
-	public Class<? extends IHyperlinkDetector> bindIHyperlinkDetector() {
-		return NullHyperlinkDetector.class;
-	}
+//	@Override
+//	public Class<? extends IHyperlinkDetector> bindIHyperlinkDetector() {
+//		return NullHyperlinkDetector.class;
+//	}
 
 
 	public com.google.inject.Provider<org.eclipse.xtext.resource.containers.IAllContainersState> provideIAllContainersState() {
 	public com.google.inject.Provider<org.eclipse.xtext.resource.containers.IAllContainersState> provideIAllContainersState() {
 		if (Access.getJdtHelper().get().isJavaCoreAvailable()) {
 		if (Access.getJdtHelper().get().isJavaCoreAvailable()) {

+ 4 - 5
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/SimulationModule.java

@@ -12,15 +12,14 @@ package org.yakindu.sct.simulation.core.sexec;
 
 
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.service.AbstractGenericModule;
 import org.eclipse.xtext.service.AbstractGenericModule;
+import org.yakindu.base.types.DefaultTypeSystem;
 import org.yakindu.base.types.ITypeSystem;
 import org.yakindu.base.types.ITypeSystem;
 import org.yakindu.sct.model.sexec.transformation.IModelSequencer;
 import org.yakindu.sct.model.sexec.transformation.IModelSequencer;
 import org.yakindu.sct.model.sexec.transformation.ModelSequencer;
 import org.yakindu.sct.model.sexec.transformation.ModelSequencer;
 import org.yakindu.sct.model.sexec.transformation.SequencerModule;
 import org.yakindu.sct.model.sexec.transformation.SequencerModule;
 import org.yakindu.sct.model.stext.naming.StextNameProvider;
 import org.yakindu.sct.model.stext.naming.StextNameProvider;
 import org.yakindu.sct.model.stext.types.ISTextTypeInferrer;
 import org.yakindu.sct.model.stext.types.ISTextTypeInferrer;
-import org.yakindu.sct.model.stext.types.ISTextTypeSystem;
 import org.yakindu.sct.model.stext.types.STextDefaultTypeInferrer;
 import org.yakindu.sct.model.stext.types.STextDefaultTypeInferrer;
-import org.yakindu.sct.model.stext.types.STextDefaultTypeSystem;
 import org.yakindu.sct.simulation.core.engine.ISimulationEngine;
 import org.yakindu.sct.simulation.core.engine.ISimulationEngine;
 import org.yakindu.sct.simulation.core.sexec.container.DefaultExecutionContextInitializer;
 import org.yakindu.sct.simulation.core.sexec.container.DefaultExecutionContextInitializer;
 import org.yakindu.sct.simulation.core.sexec.container.DefaultSimulationEngineFactory;
 import org.yakindu.sct.simulation.core.sexec.container.DefaultSimulationEngineFactory;
@@ -97,11 +96,11 @@ public class SimulationModule extends AbstractGenericModule {
 	}
 	}
 
 
 	public Class<? extends ITypeSystem> bindITypeSystem() {
 	public Class<? extends ITypeSystem> bindITypeSystem() {
-		return STextDefaultTypeSystem.class;
+		return DefaultTypeSystem.class;
 	}
 	}
 
 
-	public Class<? extends ISTextTypeSystem> bindISTextTypeSystem() {
-		return STextDefaultTypeSystem.class;
+	public Class<? extends ITypeSystem> bindISTextTypeSystem() {
+		return DefaultTypeSystem.class;
 	}
 	}
 
 
 	public Class<? extends ISTextTypeInferrer> bindISTextTypeInferrer() {
 	public Class<? extends ISTextTypeInferrer> bindISTextTypeInferrer() {

+ 18 - 18
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/DefaultExecutionContextInitializer.xtend

@@ -12,22 +12,22 @@ package org.yakindu.sct.simulation.core.sexec.container
 
 
 import com.google.inject.Inject
 import com.google.inject.Inject
 import org.eclipse.xtext.naming.IQualifiedNameProvider
 import org.eclipse.xtext.naming.IQualifiedNameProvider
-import org.yakindu.base.types.ITypeSystem.InferredType
+import org.yakindu.base.types.ITypeSystem
+import org.yakindu.base.types.InferredType
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.TimeEvent
 import org.yakindu.sct.model.sexec.TimeEvent
+import org.yakindu.sct.model.sgraph.Scope
 import org.yakindu.sct.model.stext.stext.EventDefinition
 import org.yakindu.sct.model.stext.stext.EventDefinition
+import org.yakindu.sct.model.stext.stext.InterfaceScope
+import org.yakindu.sct.model.stext.stext.InternalScope
 import org.yakindu.sct.model.stext.stext.OperationDefinition
 import org.yakindu.sct.model.stext.stext.OperationDefinition
 import org.yakindu.sct.model.stext.stext.VariableDefinition
 import org.yakindu.sct.model.stext.stext.VariableDefinition
 import org.yakindu.sct.model.stext.types.ISTextTypeInferrer
 import org.yakindu.sct.model.stext.types.ISTextTypeInferrer
-import org.yakindu.sct.model.stext.types.ISTextTypeSystem
 import org.yakindu.sct.simulation.core.sruntime.EventDirection
 import org.yakindu.sct.simulation.core.sruntime.EventDirection
 import org.yakindu.sct.simulation.core.sruntime.ExecutionContext
 import org.yakindu.sct.simulation.core.sruntime.ExecutionContext
+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.ExecutionEventImpl
 import org.yakindu.sct.simulation.core.sruntime.impl.ExecutionVariableImpl
 import org.yakindu.sct.simulation.core.sruntime.impl.ExecutionVariableImpl
-import org.yakindu.sct.simulation.core.sruntime.impl.CompositeSlotImpl
-import org.yakindu.sct.model.stext.stext.InternalScope
-import org.yakindu.sct.model.stext.stext.InterfaceScope
-import org.yakindu.sct.model.sgraph.Scope
 
 
 /**
 /**
  * 
  * 
@@ -37,28 +37,28 @@ import org.yakindu.sct.model.sgraph.Scope
 class DefaultExecutionContextInitializer implements IExecutionContextInitializer {
 class DefaultExecutionContextInitializer implements IExecutionContextInitializer {
 
 
 	@Inject extension IQualifiedNameProvider
 	@Inject extension IQualifiedNameProvider
-	@Inject extension ISTextTypeSystem
+	@Inject extension ITypeSystem
 	@Inject extension ISTextTypeInferrer
 	@Inject extension ISTextTypeInferrer
 
 
 	override initialize(ExecutionContext context, ExecutionFlow flow) {
 	override initialize(ExecutionContext context, ExecutionFlow flow) {
 		flow.scopes.forEach[context.slots += transform]
 		flow.scopes.forEach[context.slots += transform]
 	}
 	}
-	
-	def dispatch create new CompositeSlotImpl() transform(InternalScope scope){
+
+	def dispatch create new CompositeSlotImpl() transform(InternalScope scope) {
 		it.name = "internal"
 		it.name = "internal"
-		scope.declarations.forEach[decl | it.slots += decl.transform]
+		scope.declarations.forEach[decl|it.slots += decl.transform]
 	}
 	}
-	
-	def dispatch create new CompositeSlotImpl() transform(Scope scope){
+
+	def dispatch create new CompositeSlotImpl() transform(Scope scope) {
 		it.name = "time events"
 		it.name = "time events"
-		scope.declarations.forEach[decl | it.slots += decl.transform]
+		scope.declarations.forEach[decl|it.slots += decl.transform]
 	}
 	}
-	
-	def dispatch create new CompositeSlotImpl() transform(InterfaceScope scope){
-		if(scope.name != null) it.name = scope.name else it.name = "default" 
-		scope.declarations.forEach[decl | it.slots += decl.transform]
+
+	def dispatch create new CompositeSlotImpl() transform(InterfaceScope scope) {
+		if(scope.name != null) it.name = scope.name else it.name = "default"
+		scope.declarations.forEach[decl|it.slots += decl.transform]
 	}
 	}
-	
+
 	def dispatch create new ExecutionVariableImpl() transform(VariableDefinition variable) {
 	def dispatch create new ExecutionVariableImpl() transform(VariableDefinition variable) {
 		it.name = variable.fullyQualifiedName.lastSegment
 		it.name = variable.fullyQualifiedName.lastSegment
 		it.fqName = variable.fullyQualifiedName.toString
 		it.fqName = variable.fullyQualifiedName.toString

+ 20 - 31
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/Function.java

@@ -25,7 +25,7 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.List;
 
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EObject;
-import org.yakindu.sct.model.stext.types.ISTextTypeSystem;
+import org.yakindu.base.types.ITypeSystem;
 
 
 import com.google.inject.Inject;
 import com.google.inject.Inject;
 
 
@@ -37,8 +37,9 @@ import com.google.inject.Inject;
  */
  */
 public class Function {
 public class Function {
 
 
-	@Inject ISTextTypeSystem typeSystem;
-	
+	@Inject
+	ITypeSystem typeSystem;
+
 	/**
 	/**
 	 * Indicates that a method is a function.
 	 * Indicates that a method is a function.
 	 * 
 	 * 
@@ -72,12 +73,10 @@ public class Function {
 				final Class<?> class2 = parameterTypes2[i];
 				final Class<?> class2 = parameterTypes2[i];
 				if (class1.equals(class2))
 				if (class1.equals(class2))
 					continue;
 					continue;
-				if (class1.isAssignableFrom(class2)
-						|| Void.class.equals(class2)) {
+				if (class1.isAssignableFrom(class2) || Void.class.equals(class2)) {
 					return 1;
 					return 1;
 				}
 				}
-				if (class2.isAssignableFrom(class1)
-						|| Void.class.equals(class1)) {
+				if (class2.isAssignableFrom(class1) || Void.class.equals(class1)) {
 					return -1;
 					return -1;
 				}
 				}
 			}
 			}
@@ -95,8 +94,7 @@ public class Function {
 	 * @param paramTypes
 	 * @param paramTypes
 	 * @return
 	 * @return
 	 */
 	 */
-	public Function lookup(Class<?> functionClass, String name,
-			Class<?>... paramTypes) {
+	public Function lookup(Class<?> functionClass, String name, Class<?>... paramTypes) {
 
 
 		List<Method> functionMethods = new ArrayList<Method>();
 		List<Method> functionMethods = new ArrayList<Method>();
 		addFunctionMethods(functionClass, functionMethods);
 		addFunctionMethods(functionClass, functionMethods);
@@ -112,8 +110,7 @@ public class Function {
 		return null;
 		return null;
 	}
 	}
 
 
-	private void addFunctionMethods(Class<?> functionClass,
-			List<Method> methodList) {
+	private void addFunctionMethods(Class<?> functionClass, List<Method> methodList) {
 		List<Method> result = new ArrayList<Method>();
 		List<Method> result = new ArrayList<Method>();
 		Method[] methods = functionClass.getDeclaredMethods();
 		Method[] methods = functionClass.getDeclaredMethods();
 		for (int i = 0; i < methods.length; i++) {
 		for (int i = 0; i < methods.length; i++) {
@@ -129,8 +126,7 @@ public class Function {
 		}
 		}
 	}
 	}
 
 
-	private static boolean isCallable(Class<?>[] paramTypes,
-			Class<?>[] parameterTypes) {
+	private static boolean isCallable(Class<?>[] paramTypes, Class<?>[] parameterTypes) {
 		if (paramTypes.length != parameterTypes.length)
 		if (paramTypes.length != parameterTypes.length)
 			return false;
 			return false;
 		for (int i = 0; i < paramTypes.length; i++) {
 		for (int i = 0; i < paramTypes.length; i++) {
@@ -143,8 +139,7 @@ public class Function {
 
 
 	}
 	}
 
 
-	public Function lookup(Class<?> functionClass, String name,
-			Object... params) {
+	public Function lookup(Class<?> functionClass, String name, Object... params) {
 		Class<?>[] paramTypes = toParamTypes(params);
 		Class<?>[] paramTypes = toParamTypes(params);
 		return lookup(functionClass, name, paramTypes);
 		return lookup(functionClass, name, paramTypes);
 	}
 	}
@@ -154,19 +149,18 @@ public class Function {
 		for (int i = 0; i < params.length; i++) {
 		for (int i = 0; i < params.length; i++) {
 			if (params[i] == null)
 			if (params[i] == null)
 				continue;
 				continue;
-			if(params[i] instanceof EObject){
+			if (params[i] instanceof EObject) {
 				paramTypes[i] = EObject.class; // enumerators and complex types
 				paramTypes[i] = EObject.class; // enumerators and complex types
+			} else {
+				paramTypes[i] = params[i].getClass(); // primitive values (boxed
+														// java types)
 			}
 			}
-			else {
-				paramTypes[i] = params[i].getClass(); // primitive values (boxed java types)
-			}
-			
+
 		}
 		}
 		return paramTypes;
 		return paramTypes;
 	}
 	}
 
 
-	protected static Function createFunction(Class<?> functionClass,
-			Method functionMethod) {
+	protected static Function createFunction(Class<?> functionClass, Method functionMethod) {
 
 
 		if (functionClass == null || functionMethod == null)
 		if (functionClass == null || functionMethod == null)
 			return null;
 			return null;
@@ -174,14 +168,10 @@ public class Function {
 		try {
 		try {
 			Constructor<?> constr;
 			Constructor<?> constr;
 			try {
 			try {
-				constr = (Constructor<?>) functionClass
-						.getConstructor(new Class<?>[0]);
+				constr = (Constructor<?>) functionClass.getConstructor(new Class<?>[0]);
 			} catch (NoSuchMethodException e) {
 			} catch (NoSuchMethodException e) {
-				throw new RuntimeException(
-						"Missing default constructor in class "
-								+ functionClass.getName()
-								+ " while loading function "
-								+ functionMethod.getName() + " !");
+				throw new RuntimeException("Missing default constructor in class " + functionClass.getName()
+						+ " while loading function " + functionMethod.getName() + " !");
 			}
 			}
 
 
 			Function func = (Function) constr.newInstance(new Object[0]);
 			Function func = (Function) constr.newInstance(new Object[0]);
@@ -191,8 +181,7 @@ public class Function {
 		} catch (RuntimeException e) {
 		} catch (RuntimeException e) {
 			throw e;
 			throw e;
 		} catch (Exception e) {
 		} catch (Exception e) {
-			throw new RuntimeException("Error loading function "
-					+ functionMethod.getName() + " from function class "
+			throw new RuntimeException("Error loading function " + functionMethod.getName() + " from function class "
 					+ functionClass.getName() + " !", e);
 					+ functionClass.getName() + " !", e);
 		}
 		}
 	}
 	}

+ 7 - 2
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/IOperationMockup.java

@@ -10,6 +10,7 @@
  */
  */
 package org.yakindu.sct.simulation.core.sexec.interpreter;
 package org.yakindu.sct.simulation.core.sexec.interpreter;
 
 
+import org.yakindu.base.expressions.expressions.FeatureCall;
 import org.yakindu.base.types.Operation;
 import org.yakindu.base.types.Operation;
 
 
 /**
 /**
@@ -26,13 +27,17 @@ public interface IOperationMockup {
 	 * @return true if the implementation provides a mockup for the given
 	 * @return true if the implementation provides a mockup for the given
 	 *         definition, false otherwise
 	 *         definition, false otherwise
 	 */
 	 */
-	public boolean canExecute(Operation definition, Object... parameter);
+	public boolean canExecute(Operation definition, Object[] parameter);
+
+	public boolean canExecute(FeatureCall call, Object[] parameter);
 
 
 	/**
 	/**
 	 * Called when the operation is executed
 	 * Called when the operation is executed
 	 * 
 	 * 
 	 * @return the operations return value, maybe null
 	 * @return the operations return value, maybe null
 	 */
 	 */
-	public Object execute(Operation definition, Object... parameter);
+	public Object execute(Operation definition, Object[] parameter);
+
+	public Object execute(FeatureCall definition, Object[] parameter);
 
 
 }
 }

+ 53 - 3
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/JavaOperationMockup.java

@@ -10,6 +10,7 @@
  */
  */
 package org.yakindu.sct.simulation.core.sexec.interpreter;
 package org.yakindu.sct.simulation.core.sexec.interpreter;
 
 
+import java.util.Collections;
 import java.util.List;
 import java.util.List;
 
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFile;
@@ -18,10 +19,16 @@ import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.emf.common.util.WrappedException;
 import org.eclipse.emf.common.util.WrappedException;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.util.PolymorphicDispatcher;
 import org.eclipse.xtext.util.PolymorphicDispatcher;
+import org.yakindu.base.expressions.expressions.ElementReferenceExpression;
+import org.yakindu.base.expressions.expressions.FeatureCall;
 import org.yakindu.base.types.Operation;
 import org.yakindu.base.types.Operation;
 import org.yakindu.sct.commons.WorkspaceClassLoaderFactory;
 import org.yakindu.sct.commons.WorkspaceClassLoaderFactory;
+import org.yakindu.sct.model.stext.stext.VariableDefinition;
 import org.yakindu.sct.simulation.core.sexec.launch.ISCTLaunchParameters;
 import org.yakindu.sct.simulation.core.sexec.launch.ISCTLaunchParameters;
+import org.yakindu.sct.simulation.core.sruntime.ExecutionContext;
+import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable;
 
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.Inject;
@@ -45,7 +52,8 @@ public class JavaOperationMockup implements IOperationMockup {
 		if (launch == null)
 		if (launch == null)
 			return;
 			return;
 		callbacks = Lists.newArrayList();
 		callbacks = Lists.newArrayList();
-		IFile file = WorkspaceSynchronizer.getFile(((EObject) launch.getDebugTarget().getAdapter(EObject.class)).eResource());
+		IFile file = WorkspaceSynchronizer.getFile(((EObject) launch.getDebugTarget().getAdapter(EObject.class))
+				.eResource());
 		ClassLoader classLoader = new WorkspaceClassLoaderFactory().createClassLoader(file.getProject(), getClass()
 		ClassLoader classLoader = new WorkspaceClassLoaderFactory().createClassLoader(file.getProject(), getClass()
 				.getClassLoader());
 				.getClassLoader());
 		ILaunchConfiguration config = launch.getLaunchConfiguration();
 		ILaunchConfiguration config = launch.getLaunchConfiguration();
@@ -66,7 +74,7 @@ public class JavaOperationMockup implements IOperationMockup {
 	}
 	}
 
 
 	@Override
 	@Override
-	public boolean canExecute(Operation definition, Object... parameter) {
+	public boolean canExecute(Operation definition, Object[] parameter) {
 		if (callbacks == null)
 		if (callbacks == null)
 			initOperationCallbacks();
 			initOperationCallbacks();
 		// TODO: Check if there is a operation in the callbacks for the given
 		// TODO: Check if there is a operation in the callbacks for the given
@@ -74,7 +82,7 @@ public class JavaOperationMockup implements IOperationMockup {
 		return callbacks.size() > 0;
 		return callbacks.size() > 0;
 	}
 	}
 
 
-	public Object execute(Operation definition, Object... parameter) {
+	public Object execute(Operation definition, Object[] parameter) {
 		PolymorphicDispatcher<Object> dispatcher = new PolymorphicDispatcher<Object>(definition.getName(), definition
 		PolymorphicDispatcher<Object> dispatcher = new PolymorphicDispatcher<Object>(definition.getName(), definition
 				.getParameters().size(), definition.getParameters().size(), callbacks);
 				.getParameters().size(), definition.getParameters().size(), callbacks);
 		try {
 		try {
@@ -87,4 +95,46 @@ public class JavaOperationMockup implements IOperationMockup {
 		}
 		}
 	}
 	}
 
 
+	@Inject
+	private IQualifiedNameProvider fqnProvider;
+
+	@Override
+	public boolean canExecute(FeatureCall call, Object[] parameter) {
+		VariableDefinition definition = unwrap(call);
+		ExecutionContext context = (ExecutionContext) launch.getDebugTarget().getAdapter(ExecutionContext.class);
+		ExecutionVariable variable = context.getVariable(fqnProvider.getFullyQualifiedName(definition).toString());
+		if (variable != null)
+			return true;
+		return false;
+
+	}
+
+	@Override
+	public Object execute(FeatureCall call, Object[] parameter) {
+		VariableDefinition definition = unwrap(call);
+		Operation operation = (Operation) call.getFeature();
+		ExecutionContext context = (ExecutionContext) launch.getDebugTarget().getAdapter(ExecutionContext.class);
+		ExecutionVariable variable = context.getVariable(fqnProvider.getFullyQualifiedName(definition).toString());
+		PolymorphicDispatcher<Object> dispatcher = new PolymorphicDispatcher<Object>(operation.getName(), operation
+				.getParameters().size(), operation.getParameters().size(), Collections.singletonList(variable
+				.getValue()));
+		try {
+			return dispatcher.invoke(parameter);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			return null;
+		}
+	}
+
+	protected VariableDefinition unwrap(FeatureCall call) {
+		if (call.getOwner() instanceof ElementReferenceExpression) {
+			ElementReferenceExpression refExp = (ElementReferenceExpression) call.getOwner();
+			EObject reference = refExp.getReference();
+			if (reference instanceof VariableDefinition) {
+				return (VariableDefinition) reference;
+			}
+		}
+		return null;
+	}
+
 }
 }

+ 2 - 3
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/StextStatementInterpreter.xtend

@@ -228,9 +228,8 @@ class StextStatementInterpreter extends AbstractStatementInterpreter {
 	def dispatch Object execute(FeatureCall call) {
 	def dispatch Object execute(FeatureCall call) {
 		if (call.operationCall) {
 		if (call.operationCall) {
 			var parameter = call.args.map(it|execute)
 			var parameter = call.args.map(it|execute)
-			var operation = call.feature as Operation
-			if (operationDelegate.canExecute(operation, parameter)) {
-				return operationDelegate.execute(operation, parameter)
+			if (operationDelegate.canExecute(call, parameter)) {
+				return operationDelegate.execute(call, parameter)
 			}
 			}
 		} else if (call.getFeature() instanceof Enumerator) {
 		} else if (call.getFeature() instanceof Enumerator) {
 			return call.getFeature();
 			return call.getFeature();

+ 1 - 2
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/ExecutionSlot.java

@@ -11,8 +11,7 @@
 package org.yakindu.sct.simulation.core.sruntime;
 package org.yakindu.sct.simulation.core.sruntime;
 
 
 import org.yakindu.base.base.NamedElement;
 import org.yakindu.base.base.NamedElement;
-
-import org.yakindu.base.types.ITypeSystem.InferredType;
+import org.yakindu.base.types.InferredType;
 
 
 /**
 /**
  * <!-- begin-user-doc -->
  * <!-- begin-user-doc -->

+ 1 - 1
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/ExecutionContextImpl.java

@@ -27,7 +27,7 @@ import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 import org.yakindu.base.base.impl.NamedElementImpl;
 import org.yakindu.base.base.impl.NamedElementImpl;
-import org.yakindu.base.types.ITypeSystem.InferredType;
+import org.yakindu.base.types.InferredType;
 import org.yakindu.sct.model.sgraph.RegularState;
 import org.yakindu.sct.model.sgraph.RegularState;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.simulation.core.sruntime.CompositeSlot;
 import org.yakindu.sct.simulation.core.sruntime.CompositeSlot;

+ 0 - 3
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/ExecutionEventImpl.java

@@ -11,11 +11,8 @@
 package org.yakindu.sct.simulation.core.sruntime.impl;
 package org.yakindu.sct.simulation.core.sruntime.impl;
 
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.Notification;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EClass;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
 import org.yakindu.sct.simulation.core.sruntime.EventDirection;
 import org.yakindu.sct.simulation.core.sruntime.EventDirection;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionEvent;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionEvent;
 import org.yakindu.sct.simulation.core.sruntime.SRuntimePackage;
 import org.yakindu.sct.simulation.core.sruntime.SRuntimePackage;

+ 1 - 6
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/ExecutionSlotImpl.java

@@ -11,15 +11,10 @@
 package org.yakindu.sct.simulation.core.sruntime.impl;
 package org.yakindu.sct.simulation.core.sruntime.impl;
 
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.Notification;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EClass;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
 import org.yakindu.base.base.impl.NamedElementImpl;
 import org.yakindu.base.base.impl.NamedElementImpl;
-
-import org.yakindu.base.types.ITypeSystem.InferredType;
-
+import org.yakindu.base.types.InferredType;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionSlot;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionSlot;
 import org.yakindu.sct.simulation.core.sruntime.SRuntimePackage;
 import org.yakindu.sct.simulation.core.sruntime.SRuntimePackage;
 
 

+ 0 - 1
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/ExecutionVariableImpl.java

@@ -11,7 +11,6 @@
 package org.yakindu.sct.simulation.core.sruntime.impl;
 package org.yakindu.sct.simulation.core.sruntime.impl;
 
 
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EClass;
-
 import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable;
 import org.yakindu.sct.simulation.core.sruntime.SRuntimePackage;
 import org.yakindu.sct.simulation.core.sruntime.SRuntimePackage;
 
 

+ 8 - 2
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/SRuntimeFactoryImpl.java

@@ -16,10 +16,16 @@ import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.impl.EFactoryImpl;
 import org.eclipse.emf.ecore.impl.EFactoryImpl;
 import org.eclipse.emf.ecore.plugin.EcorePlugin;
 import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.yakindu.base.types.ITypeSystem.InferredType;
+import org.yakindu.base.types.InferredType;
 import org.yakindu.base.types.PrimitiveType;
 import org.yakindu.base.types.PrimitiveType;
 import org.yakindu.base.types.TypesFactory;
 import org.yakindu.base.types.TypesFactory;
-import org.yakindu.sct.simulation.core.sruntime.*;
+import org.yakindu.sct.simulation.core.sruntime.CompositeSlot;
+import org.yakindu.sct.simulation.core.sruntime.EventDirection;
+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.SRuntimeFactory;
+import org.yakindu.sct.simulation.core.sruntime.SRuntimePackage;
 
 
 /**
 /**
  * <!-- begin-user-doc --> An implementation of the model <b>Factory</b>. <!--
  * <!-- begin-user-doc --> An implementation of the model <b>Factory</b>. <!--

+ 1 - 1
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/sruntime/impl/SRuntimePackageImpl.java

@@ -19,7 +19,7 @@ import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.impl.EPackageImpl;
 import org.eclipse.emf.ecore.impl.EPackageImpl;
 import org.yakindu.base.base.BasePackage;
 import org.yakindu.base.base.BasePackage;
-import org.yakindu.base.types.ITypeSystem.InferredType;
+import org.yakindu.base.types.InferredType;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.simulation.core.sruntime.CompositeSlot;
 import org.yakindu.sct.simulation.core.sruntime.CompositeSlot;
 import org.yakindu.sct.simulation.core.sruntime.EventDirection;
 import org.yakindu.sct.simulation.core.sruntime.EventDirection;

Plik diff jest za duży
+ 287 - 425
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/TypeInferrerTest.java