Przeglądaj źródła

Extracted logic for resolving execution variable based on a model element into own helper class. Fixed operation call dispatching for calls on properties within complex type variables.

tomqc86@googlemail.com 11 lat temu
rodzic
commit
fac6e0e537

+ 55 - 0
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/ExecutionContextHelper.xtend

@@ -0,0 +1,55 @@
+package org.yakindu.sct.simulation.core.sexec.interpreter
+
+import com.google.inject.Inject
+import org.eclipse.xtext.naming.IQualifiedNameProvider
+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.Operation
+import org.yakindu.base.types.Property
+import org.yakindu.sct.model.stext.stext.VariableDefinition
+import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable
+import org.yakindu.sct.simulation.core.sruntime.ExecutionContext
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.xtext.util.SimpleAttributeResolver
+
+class ExecutionContextHelper {
+	
+	@Inject
+	extension IQualifiedNameProvider nameProvider
+	
+	def dispatch ExecutionVariable resolveVariable(ExecutionContext context, ElementReferenceExpression e) {
+		if (e.reference instanceof VariableDefinition) {
+			return context.getVariable(e.reference.getFullyQualifiedName.toString)
+		} 
+		else null
+	}
+
+	def dispatch ExecutionVariable resolveVariable(ExecutionContext context, FeatureCall e) {
+		if (e.feature instanceof VariableDefinition) {
+			return context.getVariable(e.feature.getFullyQualifiedName.toString)
+		}
+		else if (e.feature instanceof Property) {
+			// get var def where to set this property (TODO: nested properties?)
+			var current = e
+			while (!(current.owner instanceof ElementReferenceExpression))
+				current = current.owner as FeatureCall
+				
+			val varDef = (current.owner as ElementReferenceExpression).reference as VariableDefinition
+			return context.getVariable(varDef.getFullyQualifiedName.append(e.feature.name).toString)
+		}
+		else if (e.feature instanceof Operation) {
+			// for operation return the execution variable of the operation call's owner on which the operation is to be executed
+			return context.resolveVariable(e.owner)
+		}
+		else null
+	}
+
+	def dispatch ExecutionVariable resolveVariable(ExecutionContext context, AssignmentExpression e) {
+		return context.resolveVariable(e.varRef)
+	}
+	
+	def private name(EObject e) {
+		return SimpleAttributeResolver::NAME_RESOLVER.apply(e)
+	}
+}

+ 5 - 21
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/JavaOperationMockup.java

@@ -19,13 +19,10 @@ import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.emf.common.util.WrappedException;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.xtext.naming.IQualifiedNameProvider;
 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.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.sruntime.ExecutionContext;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable;
@@ -45,6 +42,9 @@ public class JavaOperationMockup implements IOperationMockup {
 
 	@Inject(optional = true)
 	private ILaunch launch;
+	
+	@Inject
+	private ExecutionContextHelper helper;
 
 	private List<Object> callbacks;
 
@@ -95,14 +95,10 @@ 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());
+		ExecutionVariable variable = helper.resolveVariable(context, call);
 		if (variable != null)
 			return true;
 		return false;
@@ -111,10 +107,9 @@ public class JavaOperationMockup implements IOperationMockup {
 
 	@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());
+		ExecutionVariable variable = helper.resolveVariable(context, call); 
 		PolymorphicDispatcher<Object> dispatcher = new PolymorphicDispatcher<Object>(operation.getName(), operation
 				.getParameters().size(), operation.getParameters().size(), Collections.singletonList(variable
 				.getValue()));
@@ -126,15 +121,4 @@ public class JavaOperationMockup implements IOperationMockup {
 		}
 	}
 
-	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;
-	}
-
 }

+ 50 - 78
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/StextStatementInterpreter.xtend

@@ -8,46 +8,42 @@
  * 	committers of YAKINDU - initial API and implementation
  * 
  */
-package org.yakindu.sct.simulation.core.sexec.interpreter
-
-import com.google.inject.Inject
-import org.eclipse.emf.ecore.EObject
-import org.eclipse.xtext.naming.IQualifiedNameProvider
-import org.eclipse.xtext.util.SimpleAttributeResolver
-import org.yakindu.base.expressions.expressions.AssignmentExpression
-import org.yakindu.base.expressions.expressions.AssignmentOperator
-import org.yakindu.base.expressions.expressions.BitwiseAndExpression
-import org.yakindu.base.expressions.expressions.BitwiseOrExpression
-import org.yakindu.base.expressions.expressions.BitwiseXorExpression
-import org.yakindu.base.expressions.expressions.BoolLiteral
-import org.yakindu.base.expressions.expressions.ConditionalExpression
-import org.yakindu.base.expressions.expressions.ElementReferenceExpression
-import org.yakindu.base.expressions.expressions.Expression
-import org.yakindu.base.expressions.expressions.FeatureCall
-import org.yakindu.base.expressions.expressions.HexLiteral
-import org.yakindu.base.expressions.expressions.IntLiteral
-import org.yakindu.base.expressions.expressions.LogicalAndExpression
-import org.yakindu.base.expressions.expressions.LogicalNotExpression
-import org.yakindu.base.expressions.expressions.LogicalOrExpression
-import org.yakindu.base.expressions.expressions.LogicalRelationExpression
-import org.yakindu.base.expressions.expressions.NumericalAddSubtractExpression
-import org.yakindu.base.expressions.expressions.NumericalMultiplyDivideExpression
-import org.yakindu.base.expressions.expressions.NumericalUnaryExpression
-import org.yakindu.base.expressions.expressions.ParenthesizedExpression
-import org.yakindu.base.expressions.expressions.PrimitiveValueExpression
-import org.yakindu.base.expressions.expressions.RealLiteral
-import org.yakindu.base.expressions.expressions.ShiftExpression
-import org.yakindu.base.expressions.expressions.StringLiteral
-import org.yakindu.base.types.Enumerator
-import org.yakindu.base.types.Operation
-import org.yakindu.base.types.Property
-import org.yakindu.base.types.Event
-import org.yakindu.sct.model.stext.stext.ActiveStateReferenceExpression
-import org.yakindu.sct.model.stext.stext.EventDefinition
-import org.yakindu.sct.model.stext.stext.EventRaisingExpression
-import org.yakindu.sct.model.stext.stext.EventValueReferenceExpression
-import org.yakindu.sct.model.stext.stext.VariableDefinition
-import org.yakindu.sct.simulation.core.sruntime.ExecutionContext
import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable
+package org.yakindu.sct.simulation.core.sexec.interpreter
+
+import com.google.inject.Inject
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.xtext.naming.IQualifiedNameProvider
+import org.yakindu.base.expressions.expressions.AssignmentExpression
+import org.yakindu.base.expressions.expressions.AssignmentOperator
+import org.yakindu.base.expressions.expressions.BitwiseAndExpression
+import org.yakindu.base.expressions.expressions.BitwiseOrExpression
+import org.yakindu.base.expressions.expressions.BitwiseXorExpression
+import org.yakindu.base.expressions.expressions.BoolLiteral
+import org.yakindu.base.expressions.expressions.ConditionalExpression
+import org.yakindu.base.expressions.expressions.ElementReferenceExpression
+import org.yakindu.base.expressions.expressions.Expression
+import org.yakindu.base.expressions.expressions.FeatureCall
+import org.yakindu.base.expressions.expressions.HexLiteral
+import org.yakindu.base.expressions.expressions.IntLiteral
+import org.yakindu.base.expressions.expressions.LogicalAndExpression
+import org.yakindu.base.expressions.expressions.LogicalNotExpression
+import org.yakindu.base.expressions.expressions.LogicalOrExpression
+import org.yakindu.base.expressions.expressions.LogicalRelationExpression
+import org.yakindu.base.expressions.expressions.NumericalAddSubtractExpression
+import org.yakindu.base.expressions.expressions.NumericalMultiplyDivideExpression
+import org.yakindu.base.expressions.expressions.NumericalUnaryExpression
+import org.yakindu.base.expressions.expressions.ParenthesizedExpression
+import org.yakindu.base.expressions.expressions.PrimitiveValueExpression
+import org.yakindu.base.expressions.expressions.RealLiteral
+import org.yakindu.base.expressions.expressions.ShiftExpression
+import org.yakindu.base.expressions.expressions.StringLiteral
+import org.yakindu.base.types.Enumerator
+import org.yakindu.base.types.Operation
+import org.yakindu.sct.model.stext.stext.ActiveStateReferenceExpression
+import org.yakindu.sct.model.stext.stext.EventDefinition
+import org.yakindu.sct.model.stext.stext.EventRaisingExpression
+import org.yakindu.sct.model.stext.stext.EventValueReferenceExpression
+import org.yakindu.sct.simulation.core.sruntime.ExecutionContext
 
 /**
  * 
@@ -60,7 +56,9 @@ class StextStatementInterpreter extends AbstractStatementInterpreter {
 	@Inject
 	extension IQualifiedNameProvider provider
 	@Inject
-	IOperationMockup operationDelegate
+	IOperationMockup operationDelegate
+	@Inject
+	extension ExecutionContextHelper helper
 
 	protected ExecutionContext context
 
@@ -78,7 +76,7 @@ class StextStatementInterpreter extends AbstractStatementInterpreter {
 	}
 
 	def Object executeAssignment(AssignmentExpression assignment) {
-		var scopeVariable = assignment.varRef.variable
+		var scopeVariable = context.resolveVariable(assignment.varRef)
 		var result = assignment.expression.execute
 		if (assignment.operator == AssignmentOperator::ASSIGN) {
 			scopeVariable.value = result
@@ -89,39 +87,12 @@ class StextStatementInterpreter extends AbstractStatementInterpreter {
 		scopeVariable.value
 	}
 
-	def dispatch ExecutionVariable variable(ElementReferenceExpression e) {
-		if (e.reference instanceof VariableDefinition) {
-			return context.getVariable(e.reference.getFullyQualifiedName.toString)
-		} 
-		else null
-	}
-
-	def dispatch ExecutionVariable variable(FeatureCall e) {
-		if (e.feature instanceof VariableDefinition) {
-			return context.getVariable(e.feature.getFullyQualifiedName.toString)
-		}
-		else if (e.feature instanceof Property) {
-			// get var def where to set this property (TODO: nested properties?)
-			var current = e
-			while (!(current.owner instanceof ElementReferenceExpression))
-				current = current.owner as FeatureCall
-				
-			val varDef = (current.owner as ElementReferenceExpression).reference as VariableDefinition
-			return context.getVariable(varDef.getFullyQualifiedName.append(e.feature.name).toString)
-		}
-		else null
-	}
-
-	def dispatch ExecutionVariable variable(AssignmentExpression e) {
-		return e.varRef.variable as ExecutionVariable
-	}
-
 	def dispatch event(ElementReferenceExpression e) {
 		if(e.reference instanceof EventDefinition ) e.reference else null
 	}
 
 	def dispatch event(FeatureCall e) {
-		if(e.feature instanceof EventDefinition || e.feature instanceof Event) e.feature else null
+		if(e.feature instanceof EventDefinition) e.feature else null
 	}
 
 	def dispatch Object execute(EventRaisingExpression eventRaising) {
@@ -148,12 +119,17 @@ class StextStatementInterpreter extends AbstractStatementInterpreter {
 				return operationDelegate.execute((expression.reference as Operation), parameter.toArray)
 			}
 		}
-
-		var variableRef = context.getVariable(expression.reference.getFullyQualifiedName.toString)
+		val fqn = expression.reference.getFullyQualifiedName.toString
+		var variableRef = context.getVariable(fqn)
 		if (variableRef != null) {
 			return variableRef.getValue
 		}
-		return context.getEvent(expression.reference.getFullyQualifiedName.toString).raised
+		val eventRef = context.getEvent(fqn)
+		if (eventRef != null) {
+			return eventRef.raised
+		}
+		// reference to an element with complex type is not reflected in an execution variable but in a composite slot
+		return fqn
 	}
 
 	def dispatch Object execute(EventValueReferenceExpression expression) {
@@ -165,10 +141,6 @@ class StextStatementInterpreter extends AbstractStatementInterpreter {
 		null;
 	}
 
-	def name(EObject e) {
-		return SimpleAttributeResolver::NAME_RESOLVER.apply(e)
-	}
-
 	def dispatch qname(FeatureCall e) {
 		return e.feature.getFullyQualifiedName.toString
 	}
@@ -254,7 +226,7 @@ class StextStatementInterpreter extends AbstractStatementInterpreter {
 		} else if (call.getFeature() instanceof Enumerator) {
 			return call.getFeature();
 		} else {
-			var variableRef = call.variable
+			var variableRef = context.resolveVariable(call)
 			if (variableRef != null) {
 				return variableRef.getValue
 			}