|
@@ -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)
|
|
|
}
|
|
|
-}
|
|
|
+}
|