Browse Source

Transforming import scope into import declarations holding references to externally defined variable definitions instead of copying them.

tomqc86@googlemail.com 11 years ago
parent
commit
9dca0714cd

+ 19 - 7
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/ModelSequencer.xtend

@@ -10,6 +10,7 @@ import org.eclipse.xtext.naming.IQualifiedNameProvider
 import org.yakindu.base.expressions.expressions.ElementReferenceExpression
 import org.yakindu.base.expressions.expressions.FeatureCall
 import org.yakindu.base.types.Feature
+import org.yakindu.base.types.Package
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.TimeEvent
 import org.yakindu.sct.model.sgraph.Declaration
@@ -17,6 +18,8 @@ import org.yakindu.sct.model.sgraph.Statechart
 import org.yakindu.sct.model.stext.stext.EventDefinition
 import org.yakindu.sct.model.stext.stext.OperationDefinition
 import org.yakindu.sct.model.stext.stext.VariableDefinition
+import org.yakindu.sct.model.stext.stext.ImportScope
+import org.yakindu.sct.model.sgraph.ImportDeclaration
 
 class ModelSequencer implements IModelSequencer {
 	 
@@ -85,21 +88,30 @@ class ModelSequencer implements IModelSequencer {
 	
 	def retargetDeclRefs(ExecutionFlow flow) {
 		val allContent = EcoreUtil2::eAllContentsAsList(flow)
-		val declared = allContent.filter(e | e instanceof EventDefinition || e instanceof VariableDefinition || e instanceof OperationDefinition).toSet
+		val declared = flow.scopes.map[
+			if (it instanceof ImportScope) {
+				declarations.filter(ImportDeclaration).map[declaration].toList
+			} else { 
+				declarations
+			}
+		].flatten.toSet
 		
 		allContent.filter(typeof(ElementReferenceExpression)).forEach( ere | ere.retarget(declared) )
 		allContent.filter(typeof(FeatureCall)).forEach( call|call.retarget(declared))
 	}
 	
 	
-	def retarget(ElementReferenceExpression ere, Collection<EObject> declared) {
+	def retarget(ElementReferenceExpression ere, Collection<Declaration> declared) {
 		if (ere.reference != null && ! declared.contains(ere.reference) ) {
-			val r = ere.reference.replaced 
-			if (r != null) ere.reference = r
+			// elements within externally declared packages should not be replaced but referenced
+			if (EcoreUtil2.getContainerOfType(ere.reference, Package) == null) {
+				val r = ere.reference.replaced 
+				if (r != null) ere.reference = r
+			}
 		}
 	}
 
-	def retarget(FeatureCall call, Collection<EObject> declared) {
+	def retarget(FeatureCall call, Collection<Declaration> declared) {
 		if (call.feature != null && ! declared.contains(call.feature) ) {
 			val r = call.feature.replaced 
 			if ( r != null ) call.feature = r as Feature	
@@ -127,11 +139,11 @@ class ModelSequencer implements IModelSequencer {
 	}
 	
 	def dispatch replaced(EventDefinition ed) {
-		ed.create	
+		ed.create
 	}
 
 	def dispatch replaced(TimeEvent ed) {
-		ed	
+		ed
 	}
 	
 		 	

+ 5 - 1
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/SequenceBuilder.xtend

@@ -29,6 +29,7 @@ import org.yakindu.sct.model.stext.stext.TimeUnit
 import org.yakindu.sct.model.stext.stext.VariableDefinition
 
 import static extension org.eclipse.emf.ecore.util.EcoreUtil.*
+import org.yakindu.sct.model.sgraph.ImportDeclaration
 
 class SequenceBuilder {
 
@@ -444,7 +445,10 @@ class SequenceBuilder {
 		initSequence.name = "init"
 		initSequence.comment = "Default init sequence for statechart " + sc.name
 	
-		for (VariableDefinition vd : flow.scopes.map(s|s.variables).flatten.filter(typeof(VariableDefinition))) {
+		val statechartVariables = flow.scopes.map(s|s.variables).flatten.filter(typeof(VariableDefinition))
+		val importedVariables = flow.scopes.map(s|s.declarations).flatten.filter(typeof(ImportDeclaration)).map(d|d.declaration).filter(typeof(VariableDefinition))
+	
+		for (VariableDefinition vd : statechartVariables+importedVariables) {
 			if (vd.effectiveInitialValue != null) {
 				initSequence.steps.add(vd.createInitialization)
 			}

+ 14 - 5
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/SexecElementMapping.xtend

@@ -3,12 +3,16 @@ package org.yakindu.sct.model.sexec.transformation
 import com.google.inject.Inject
 import com.google.inject.Singleton
 import org.eclipse.emf.ecore.util.EcoreUtil
+import org.eclipse.xtext.EcoreUtil2
 import org.eclipse.xtext.naming.IQualifiedNameProvider
 import org.eclipse.xtext.util.Strings
 import org.yakindu.base.base.NamedElement
 import org.yakindu.base.expressions.expressions.BoolLiteral
 import org.yakindu.base.expressions.expressions.ElementReferenceExpression
+import org.yakindu.base.expressions.expressions.Expression
+import org.yakindu.base.expressions.expressions.ExpressionsFactory
 import org.yakindu.base.expressions.expressions.FeatureCall
+import org.yakindu.base.types.Package
 import org.yakindu.sct.model.sexec.Call
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.CheckRef
@@ -42,6 +46,7 @@ import org.yakindu.sct.model.sgraph.Trigger
 import org.yakindu.sct.model.stext.stext.AlwaysEvent
 import org.yakindu.sct.model.stext.stext.EventDefinition
 import org.yakindu.sct.model.stext.stext.EventSpec
+import org.yakindu.sct.model.stext.stext.ImportScope
 import org.yakindu.sct.model.stext.stext.InterfaceScope
 import org.yakindu.sct.model.stext.stext.LocalReaction
 import org.yakindu.sct.model.stext.stext.OperationDefinition
@@ -50,9 +55,6 @@ import org.yakindu.sct.model.stext.stext.StextFactory
 import org.yakindu.sct.model.stext.stext.TimeEventSpec
 import org.yakindu.sct.model.stext.stext.TimeEventType
 import org.yakindu.sct.model.stext.stext.VariableDefinition
-import org.yakindu.base.expressions.expressions.Expression
-import org.yakindu.base.expressions.expressions.ExpressionsFactory
-import org.yakindu.sct.model.stext.stext.ImportScope
 
 @Singleton class SexecElementMapping {
 	
@@ -254,8 +256,15 @@ import org.yakindu.sct.model.stext.stext.ImportScope
 
 	var factory = ExpressionsFactory.eINSTANCE
 	def dispatch Expression raised(RegularEventSpec e) {
+		
+		val event = e.resolveRegularEventSpec(e.eContainer)
+		// for externally defined events, return the original feature call
+		if (EcoreUtil2.getContainerOfType(event, Package) != null && e.event instanceof FeatureCall) {
+			return EcoreUtil.copy(e.event) as FeatureCall
+		}
+		
 		val r = factory.createElementReferenceExpression
-		r.reference = e.resolveRegularEventSpec(e.eContainer)
+		r.reference = event
 		return r
 	} 	 
 	
@@ -263,7 +272,7 @@ import org.yakindu.sct.model.stext.stext.ImportScope
 	def dispatch NamedElement resolveRegularEventSpec(RegularEventSpec re, Object context) { if ( re.event != null ) re.event.resolveRegularEventSpec(re) }
 	def dispatch NamedElement resolveRegularEventSpec(FeatureCall fc, Object context) { if (fc.feature != null) fc.feature.resolveRegularEventSpec(fc) }
 	def dispatch NamedElement resolveRegularEventSpec(ElementReferenceExpression ter, Object context) { if (ter.reference != null) ter.reference.resolveRegularEventSpec(ter) }
-	def dispatch NamedElement resolveRegularEventSpec(EventDefinition ed, Object context) { ed.create }
+	def dispatch NamedElement resolveRegularEventSpec(EventDefinition ed, Object context) { ed }
 	
 	
 	def dispatch Expression raised(TimeEventSpec e) {

+ 8 - 1
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/StructureMapping.xtend

@@ -23,6 +23,7 @@ import org.eclipse.xtext.naming.IQualifiedNameProvider
 import org.yakindu.sct.model.stext.stext.ImportScope
 import org.yakindu.sct.model.stext.stext.Import
 import org.yakindu.sct.model.stext.util.ImportResolver
+import org.yakindu.sct.model.sgraph.SGraphFactory
 
 class StructureMapping {
 	 
@@ -61,7 +62,13 @@ class StructureMapping {
 	def dispatch Scope mapScope(ImportScope scope) {
 		val _scope = scope.createScope
 		for (Import imp : scope.imports) {
-			_scope.declarations.addAll(resolver.getImportedElementsOfType(imp, VariableDefinition).map(decl | decl.map).filterNull)
+			val decls = resolver.getImportedElementsOfType(imp, VariableDefinition)
+			for (Declaration decl : decls) {
+				val importDecl = SGraphFactory.eINSTANCE.createImportDeclaration
+				importDecl.name = decl.name
+				importDecl.declaration = decl
+				_scope.declarations.add(importDecl)
+			}
 		}
 		return _scope
 	}