Browse Source

Rework s exec extensions (#2059)

* Move methods from Navigation to superclass SExecExtensions

* Adapt Java Generator to SExecExtensions changes

* Remove empty Navigation classes

* Simplify SExecExtensions & adapt Java Generator

* Deprecate 'hasLocalScope' for 'hasInternalScope' (consistency)

* Minor fixes
Rene Beckmann 7 years ago
parent
commit
2d262f847d
30 changed files with 208 additions and 305 deletions
  1. 2 2
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CExpressionsGenerator.xtend
  2. 2 2
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CGenerator.xtend
  3. 2 2
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/FlowCode.xtend
  4. 2 2
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineHeader.xtend
  5. 2 2
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineRequiredHeader.xtend
  6. 3 3
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineSource.xtend
  7. 2 3
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/StatechartEventsHeader.xtend
  8. 2 2
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/StatechartEventsSource.xtend
  9. 2 3
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/extensions/EventNaming.xtend
  10. 2 1
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/extensions/Naming.xtend
  11. 0 58
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/extensions/Navigation.xtend
  12. 3 2
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppExpressionsGenerator.xtend
  13. 2 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppGenerator.xtend
  14. 2 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppNaming.xtend
  15. 2 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/EventCode.xtend
  16. 2 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/FlowCode.xtend
  17. 0 41
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/Navigation.xtend
  18. 2 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StandardCppIncludeProvider.xtend
  19. 2 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineHeader.xtend
  20. 3 2
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineImplementation.xtend
  21. 2 2
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/eventdriven/EventNaming.xtend
  22. 2 2
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/eventdriven/StatechartEvents.xtend
  23. 8 7
      plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/JavaExpressionsGenerator.xtend
  24. 4 3
      plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/JavaGenerator.xtend
  25. 0 107
      plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/Navigation.xtend
  26. 2 1
      plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/Statemachine.xtend
  27. 4 2
      plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/StatemachineInterface.xtend
  28. 5 5
      plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/wrappers/CycleBasedSynchronizedWrapper.xtend
  29. 5 5
      plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/wrappers/EventBasedRunnableWrapper.xtend
  30. 137 40
      plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/extensions/SExecExtensions.xtend

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CExpressionsGenerator.xtend

@@ -33,8 +33,8 @@ import org.yakindu.base.types.inferrer.ITypeSystemInferrer
 import org.yakindu.base.types.typesystem.GenericTypeSystem
 import org.yakindu.base.types.typesystem.ITypeSystem
 import org.yakindu.sct.generator.c.extensions.Naming
-import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.templates.ExpressionsGenerator
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.stext.stext.ActiveStateReferenceExpression
 import org.yakindu.sct.model.stext.stext.EventRaisingExpression
@@ -45,7 +45,7 @@ import org.yakindu.sct.model.stext.stext.VariableDefinition
 class CExpressionsGenerator extends ExpressionsGenerator {
 
 	@Inject protected extension Naming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 
 	@Inject protected extension ITypeSystem
 	@Inject protected extension ITypeSystemInferrer

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CGenerator.xtend

@@ -15,10 +15,10 @@ import org.eclipse.xtext.generator.IFileSystemAccess
 import org.yakindu.sct.generator.c.IGenArtifactConfigurations.GenArtifactConfiguration
 import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.generator.c.extensions.Naming
-import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.IExecutionFlowGenerator
 import org.yakindu.sct.generator.core.library.ICoreLibraryHelper
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sgen.GeneratorEntry
 
 import static org.yakindu.sct.generator.core.filesystem.ISCTFileSystemAccess.*
@@ -34,7 +34,7 @@ class CGenerator implements IExecutionFlowGenerator {
 	@Inject extension StatemachineHeader statemachineHeader
 	@Inject extension StatemachineSource statemachineSource
 	@Inject extension StatemachineRequiredHeader statemachineRequiredHeader
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension GenmodelEntries
 	@Inject extension Naming
 	@Inject extension ICoreLibraryHelper

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/FlowCode.xtend

@@ -13,7 +13,6 @@ package org.yakindu.sct.generator.c
 import com.google.inject.Inject
 import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.generator.c.extensions.Naming
-import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.model.sexec.Call
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.CheckRef
@@ -31,13 +30,14 @@ import org.yakindu.sct.model.sexec.Trace
 import org.yakindu.sct.model.sexec.TraceStateEntered
 import org.yakindu.sct.model.sexec.TraceStateExited
 import org.yakindu.sct.model.sexec.UnscheduleTimeEvent
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
 
 class FlowCode {
 	
 	@Inject extension Naming
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension CExpressionsGenerator
 	@Inject extension INamingService
 	@Inject extension GenmodelEntries

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineHeader.xtend

@@ -15,10 +15,10 @@ import org.yakindu.base.types.Declaration
 import org.yakindu.base.types.Direction
 import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.generator.c.extensions.Naming
-import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.TimeEvent
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sexec.transformation.StatechartExtensions
 import org.yakindu.sct.model.sgen.GeneratorEntry
@@ -35,7 +35,7 @@ import static org.eclipse.xtext.util.Strings.*
 class StatemachineHeader implements IContentTemplate {
 	@Inject protected extension IncludeProvider
 	@Inject protected extension Naming cNaming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ICodegenTypeSystemAccess
 	@Inject protected extension GenmodelEntries
 	@Inject protected extension INamingService

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineRequiredHeader.xtend

@@ -14,9 +14,9 @@ import com.google.inject.Inject
 import org.yakindu.base.types.Declaration
 import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.generator.c.extensions.Naming
-import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.stext.stext.OperationDefinition
@@ -25,7 +25,7 @@ import org.yakindu.sct.model.stext.stext.StatechartScope
 class StatemachineRequiredHeader implements IContentTemplate {
 
 	@Inject extension Naming cNaming
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension ICodegenTypeSystemAccess
 	@Inject extension GenmodelEntries
 	@Inject extension INamingService

+ 3 - 3
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineSource.xtend

@@ -16,11 +16,11 @@ import org.eclipse.xtext.util.Strings
 import org.yakindu.sct.generator.c.extensions.ExpressionsChecker
 import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.generator.c.extensions.Naming
-import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.Step
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.extensions.StateVectorExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
@@ -32,7 +32,7 @@ class StatemachineSource implements IContentTemplate {
 	
 	@Inject protected extension Naming
 	@Inject protected extension GenmodelEntries
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ICodegenTypeSystemAccess
 	@Inject protected extension INamingService
 	@Inject protected extension FlowCode
@@ -145,7 +145,7 @@ class StatemachineSource implements IContentTemplate {
 				«event.access» = bool_false;
 				«ENDFOR»
 			«ENDFOR»
-			«IF hasLocalScope»
+			«IF hasInternalScope»
 				«FOR event : internalScope.events»
 				«event.access» = bool_false;
 				«ENDFOR»

+ 2 - 3
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/StatechartEventsHeader.xtend

@@ -11,12 +11,11 @@
 package org.yakindu.sct.generator.c.eventdriven
 
 import com.google.inject.Inject
-import org.yakindu.base.types.Direction
 import org.yakindu.sct.generator.c.extensions.EventNaming
 import org.yakindu.sct.generator.c.extensions.Naming
-import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 
 /**
@@ -24,7 +23,7 @@ import org.yakindu.sct.model.sexec.naming.INamingService
  */
 class StatechartEventsHeader {
 	@Inject protected extension Naming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ICodegenTypeSystemAccess
 	@Inject protected extension INamingService
 	

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/StatechartEventsSource.xtend

@@ -13,15 +13,15 @@ package org.yakindu.sct.generator.c.eventdriven
 import com.google.inject.Inject
 import org.yakindu.base.types.Direction
 import org.yakindu.sct.generator.c.extensions.EventNaming
-import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 
 /**
  * @author René Beckmann
  */
 class StatechartEventsSource {
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension EventNaming
 	@Inject protected extension ICodegenTypeSystemAccess
 	

+ 2 - 3
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/extensions/EventNaming.xtend

@@ -12,9 +12,8 @@ package org.yakindu.sct.generator.c.extensions
 
 import com.google.inject.Inject
 import org.yakindu.base.types.Event
-import org.yakindu.sct.generator.c.extensions.Naming
-import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 
 /**
@@ -22,7 +21,7 @@ import org.yakindu.sct.model.sexec.naming.INamingService
  */
 class EventNaming {
 	@Inject extension Naming
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension INamingService
 
 	def eventEnumMemberName(Event it) {

+ 2 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/extensions/Naming.xtend

@@ -24,6 +24,7 @@ import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.ExecutionState
 import org.yakindu.sct.model.sexec.Step
 import org.yakindu.sct.model.sexec.TimeEvent
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.sgraph.Scope
@@ -40,7 +41,7 @@ import org.yakindu.sct.model.stext.stext.VariableDefinition
 class Naming {
 	@Inject @Named("Separator") protected String sep;
 
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 
 	@Inject protected extension ICodegenTypeSystemAccess
 

+ 0 - 58
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/extensions/Navigation.xtend

@@ -1,58 +0,0 @@
-/**
- * Copyright (c) 2012 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.sct.generator.c.extensions
-
-import java.util.ArrayList
-import org.eclipse.emf.ecore.EObject
-import org.yakindu.base.types.Declaration
-import org.yakindu.sct.model.sexec.ExecutionFlow
-import org.yakindu.sct.model.sexec.TimeEvent
-import org.yakindu.sct.model.sexec.extensions.SExecExtensions
-import org.yakindu.sct.model.sgraph.Scope
-import org.yakindu.sct.model.stext.stext.EventDefinition
-import org.yakindu.sct.model.stext.stext.OperationDefinition
-
-class Navigation extends SExecExtensions {
-	
-	def dispatch ExecutionFlow flow(Scope scope) {
-		if (scope.eContainer instanceof ExecutionFlow) scope.eContainer as ExecutionFlow
-		else null
-	}
-	
-	def dispatch ExecutionFlow flow(Declaration it) {
-		scope?.flow
-	}
-	
-	def dispatch ExecutionFlow flow(EObject it) {
-		eContainer.flow
-	}
-	
-	def dispatch ExecutionFlow flow(ExecutionFlow it) {
-		it
-	}
-	
-	def Scope scope(Declaration it) {
-		if (eContainer instanceof Scope) eContainer as Scope
-		else null
-	}
-	
-	def getAllEvents(ExecutionFlow it) {
-		return scopes.map[declarations.filter(EventDefinition)].reduce[i1, i2 | i1 + i2]
-	}
-	
-	def operations(ExecutionFlow it) {
-		scopes.fold(new ArrayList<OperationDefinition>(), [ l, s | l.addAll(s.declarations.filter( typeof(OperationDefinition))) return l ])
-	}
-	
-	def Scope getTimeEventScope(ExecutionFlow it) {
-		return 	scopes.filter[declarations.filter( typeof(TimeEvent) ).size > 0].head
-	}
-}

+ 3 - 2
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppExpressionsGenerator.xtend

@@ -15,18 +15,19 @@ import com.google.inject.Inject
 import org.yakindu.base.expressions.expressions.BoolLiteral
 import org.yakindu.base.expressions.expressions.ElementReferenceExpression
 import org.yakindu.base.expressions.expressions.FeatureCall
+import org.yakindu.base.expressions.expressions.StringLiteral
 import org.yakindu.base.types.typesystem.ITypeSystem
 import org.yakindu.sct.generator.c.CExpressionsGenerator
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.stext.stext.ActiveStateReferenceExpression
 import org.yakindu.sct.model.stext.stext.EventRaisingExpression
 import org.yakindu.sct.model.stext.stext.OperationDefinition
-import org.yakindu.base.expressions.expressions.StringLiteral
 
 class CppExpressionsGenerator extends CExpressionsGenerator {
 
 	@Inject protected extension CppNaming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ITypeSystem
 	@Inject protected extension INamingService
 

+ 2 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppGenerator.xtend

@@ -17,6 +17,7 @@ import org.yakindu.sct.generator.c.IGenArtifactConfigurations.GenArtifactConfigu
 import org.yakindu.sct.generator.core.IExecutionFlowGenerator
 import org.yakindu.sct.generator.core.library.ICoreLibraryHelper
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.sgraph.Statechart
 
@@ -36,7 +37,7 @@ class CppGenerator implements IExecutionFlowGenerator {
 	@Inject extension StatemachineInterface statemachineInterfaceContent
 	@Inject extension StatemachineHeader statemachineHeaderContent
 	@Inject extension StatemachineImplementation statemachineSourceContent
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension CppNaming
 	@Inject extension ICoreLibraryHelper
 

+ 2 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppNaming.xtend

@@ -19,6 +19,7 @@ import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.generator.cpp.features.GenmodelEntriesExtension
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.TimeEvent
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.sgraph.Scope
@@ -35,7 +36,7 @@ import org.yakindu.sct.model.stext.stext.VariableDefinition
  */
 class CppNaming extends Naming {
 
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ICodegenTypeSystemAccess
 	@Inject protected extension INamingService
 	@Inject protected extension GenmodelEntriesExtension

+ 2 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/EventCode.xtend

@@ -13,6 +13,7 @@ package org.yakindu.sct.generator.cpp
 import com.google.inject.Inject
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.stext.stext.EventDefinition
 import org.yakindu.sct.model.stext.stext.StatechartScope
 
@@ -21,7 +22,7 @@ import org.yakindu.sct.model.stext.stext.StatechartScope
  */
 class EventCode {
 	@Inject protected extension CppNaming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ICodegenTypeSystemAccess
 	
 	def generateEvents(ExecutionFlow it, StatechartScope scope)

+ 2 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/FlowCode.xtend

@@ -24,13 +24,14 @@ import org.yakindu.sct.model.sexec.ScheduleTimeEvent
 import org.yakindu.sct.model.sexec.Sequence
 import org.yakindu.sct.model.sexec.StateSwitch
 import org.yakindu.sct.model.sexec.UnscheduleTimeEvent
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 
 class FlowCode extends org.yakindu.sct.generator.c.FlowCode {
 	
 	@Inject extension CppNaming naming
 	@Inject extension CppExpressionsGenerator expressions
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension INamingService
 	
 	override dispatch CharSequence code(SaveHistory it) '''

+ 0 - 41
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/Navigation.xtend

@@ -1,41 +0,0 @@
-/** 
- * Copyright (c) 2015 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.sct.generator.cpp
-
-import org.yakindu.sct.model.sexec.ExecutionFlow
-import org.yakindu.sct.model.sexec.TimeEvent
-import org.yakindu.sct.model.sgraph.Scope
-import org.yakindu.sct.model.stext.stext.ImportScope
-import org.yakindu.sct.model.stext.stext.OperationDefinition
-import org.yakindu.sct.model.stext.stext.StatechartScope
-
-class Navigation extends org.yakindu.sct.generator.c.extensions.Navigation {
-	
-	def getStatechartScopes(ExecutionFlow it) {
-		scopes.filter(typeof(StatechartScope))
-	}
-	
-	def operations(Scope it) {
-		declarations.filter(typeof(OperationDefinition));
-	}
-	
-	def hasOperations(Scope it) {
-		!operations.isEmpty;
-	}
-	
-	def indexOf(TimeEvent it) {
-		scope.declarations.filter(typeof(TimeEvent)).toList.indexOf(it);
-	}
-	
-	def getInterfaces(ExecutionFlow it) {
-		scopes.filter(typeof(StatechartScope)).filter[!(it instanceof ImportScope)]
-	}
-}

+ 2 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StandardCppIncludeProvider.xtend

@@ -6,11 +6,12 @@ import org.yakindu.sct.generator.c.IGenArtifactConfigurations
 import org.yakindu.sct.generator.c.IncludeProvider
 import org.yakindu.sct.generator.c.StandardIncludeProvider
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 
 class StandardCppIncludeProvider extends StandardIncludeProvider implements IncludeProvider {
 
 	@Inject protected extension CppNaming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 
 	override getIncludes(ExecutionFlow it, List<CharSequence> includes,
 		extension IGenArtifactConfigurations artifactConfigs) {

+ 2 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineHeader.xtend

@@ -21,6 +21,7 @@ import org.yakindu.sct.generator.cpp.features.GenmodelEntriesExtension
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.Step
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.sgraph.Scope
@@ -34,7 +35,7 @@ import org.yakindu.sct.model.stext.stext.VariableDefinition
 class StatemachineHeader extends org.yakindu.sct.generator.c.StatemachineHeader {
 
 	@Inject protected extension CppNaming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ICodegenTypeSystemAccess
 	@Inject protected extension GenmodelEntriesExtension
 	@Inject protected extension INamingService

+ 3 - 2
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineImplementation.xtend

@@ -20,6 +20,7 @@ import org.yakindu.sct.generator.cpp.features.GenmodelEntriesExtension
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.Step
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.extensions.StateVectorExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
@@ -33,7 +34,7 @@ import static org.eclipse.xtext.util.Strings.*
 class StatemachineImplementation implements IContentTemplate {
 	
 	@Inject protected extension CppNaming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension FlowCode
 	@Inject protected extension GenmodelEntriesExtension
 	@Inject protected extension ICodegenTypeSystemAccess
@@ -199,7 +200,7 @@ class StatemachineImplementation implements IContentTemplate {
 				«event.access» = false;
 				«ENDFOR»
 			«ENDFOR»
-			«IF hasLocalScope»
+			«IF hasInternalScope»
 				«FOR event : internalScope.events»
 				«event.access» = false; 
 				«ENDFOR»

+ 2 - 2
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/eventdriven/EventNaming.xtend

@@ -13,8 +13,8 @@ package org.yakindu.sct.generator.cpp.eventdriven
 import com.google.inject.Inject
 import org.yakindu.base.types.Event
 import org.yakindu.sct.generator.cpp.CppNaming
-import org.yakindu.sct.generator.cpp.Navigation
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 
 /**
@@ -22,7 +22,7 @@ import org.yakindu.sct.model.sexec.naming.INamingService
  */
 class EventNaming {
 	@Inject extension CppNaming
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension INamingService
 	
 	def invalidEventEnumName(ExecutionFlow it) {

+ 2 - 2
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/eventdriven/StatechartEvents.xtend

@@ -14,9 +14,9 @@ import com.google.inject.Inject
 import org.yakindu.base.types.Direction
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.generator.cpp.CppNaming
-import org.yakindu.sct.generator.cpp.Navigation
 import org.yakindu.sct.generator.cpp.features.GenmodelEntriesExtension
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.stext.stext.EventDefinition
@@ -26,7 +26,7 @@ import org.yakindu.sct.model.stext.stext.EventDefinition
  */
 class StatechartEvents {
 	@Inject protected extension CppNaming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ICodegenTypeSystemAccess
 	@Inject protected extension GenmodelEntriesExtension
 	@Inject protected extension INamingService

+ 8 - 7
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/JavaExpressionsGenerator.xtend

@@ -30,6 +30,7 @@ import org.yakindu.base.types.typesystem.GenericTypeSystem
 import org.yakindu.base.types.typesystem.ITypeSystem
 import org.yakindu.sct.generator.core.templates.ExpressionsGenerator
 import org.yakindu.sct.model.sexec.TimeEvent
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.stext.stext.ActiveStateReferenceExpression
 import org.yakindu.sct.model.stext.stext.EventRaisingExpression
 import org.yakindu.sct.model.stext.stext.EventValueReferenceExpression
@@ -39,7 +40,7 @@ class JavaExpressionsGenerator extends ExpressionsGenerator {
 
 	@Inject protected extension Naming
 	@Inject protected extension JavaNamingService
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ITypeSystem
 	@Inject protected extension ITypeSystemInferrer
 
@@ -157,16 +158,16 @@ class JavaExpressionsGenerator extends ExpressionsGenerator {
 	}
 
 	def dispatch String getContext(Property it) {
-		if (scope !== null) {
-			return scope.interfaceName.asEscapedIdentifier + "."
+		if (interfaceScope !== null) {
+			return interfaceScope.interfaceName.asEscapedIdentifier + "."
 		}
 		return ""
 	}
 
 	def dispatch String getStaticContext(Property it) {
 		if (it.const) {
-			if (scope !== null) {
-				var result = scope.interfaceName + "."
+			if (interfaceScope !== null) {
+				var result = interfaceScope.interfaceName + "."
 				return result
 			} else {
 				var result = it.flow.statemachineInterfaceName + "."
@@ -177,8 +178,8 @@ class JavaExpressionsGenerator extends ExpressionsGenerator {
 	}
 
 	def dispatch String getContext(Declaration it) {
-		if (scope !== null) {
-			return scope.interfaceName.asEscapedIdentifier + "."
+		if (interfaceScope !== null) {
+			return interfaceScope.interfaceName.asEscapedIdentifier + "."
 		}
 		return ""
 	}

+ 4 - 3
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/JavaGenerator.xtend

@@ -14,11 +14,12 @@ import org.eclipse.xtext.generator.IFileSystemAccess
 import org.yakindu.sct.generator.core.IExecutionFlowGenerator
 import org.yakindu.sct.generator.java.features.CycleBasedWrapperFeature
 import org.yakindu.sct.generator.java.features.EventBasedRunnableFeature
+import org.yakindu.sct.generator.java.wrappers.CycleBasedSynchronizedWrapper
+import org.yakindu.sct.generator.java.wrappers.EventBasedRunnableWrapper
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
-import org.yakindu.sct.generator.java.wrappers.EventBasedRunnableWrapper
-import org.yakindu.sct.generator.java.wrappers.CycleBasedSynchronizedWrapper
 
 /**
  * This is the Java code generators main class.
@@ -32,7 +33,7 @@ class JavaGenerator implements IExecutionFlowGenerator {
 	@Inject extension EventBasedRunnableFeature
 	@Inject extension CycleBasedWrapperFeature
 
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension IStatemachine
 	@Inject extension ITimerCallback
 	@Inject extension ITimer

+ 0 - 107
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/Navigation.xtend

@@ -1,107 +0,0 @@
-/**
- *   Copyright (c) 2012 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:
- *   	Commiters of YAKINDU - Initial contribution and API
- */
-package org.yakindu.sct.generator.java
-
-import java.util.ArrayList
-import java.util.HashSet
-import java.util.List
-import org.yakindu.base.expressions.expressions.AssignmentExpression
-import org.yakindu.base.expressions.expressions.Expression
-import org.yakindu.base.types.Event
-import org.yakindu.base.types.Property
-import org.yakindu.sct.model.sexec.ExecutionFlow
-import org.yakindu.sct.model.sexec.extensions.SExecExtensions
-import org.yakindu.sct.model.sgraph.Scope
-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.VariableDefinition
-
-class Navigation extends SExecExtensions {
-
-	def List<EventDefinition> getOutgoingEvents(ExecutionFlow flow) {
-		val events = new ArrayList<EventDefinition>()
-		for (scope : flow.scopes) {
-			events.addAll(scope.outgoingEvents)
-		}
-		return events
-	}
-
-	def boolean hasOutgoingEvents(ExecutionFlow it) {
-		return !outgoingEvents.empty
-	}
-
-	def getInternalScopeEvents(ExecutionFlow flow) {
-		val events = new ArrayList<EventDefinition>
-		flow.internalScopes.forEach[events.addAll(eventDefinitions)]
-		return events
-	}
-
-	def getInternalScopeVariables(ExecutionFlow flow) {
-		val variables = new ArrayList<VariableDefinition>
-		flow.internalScopes.forEach[variables.addAll(variableDefinitions)]
-		return variables
-	}
-
-	def getDefaultScope(ExecutionFlow it) {
-		interfaceScopes.filter[name === null || name.empty].head
-	}
-
-	def Iterable<InternalScope> getInternalScopes(ExecutionFlow it) {
-		return scopes.filter(typeof(InternalScope))
-	}
-
-	def boolean hasEvents(Scope it) {
-		return !eventDefinitions.empty
-	}
-
-	def getEventDefinitions(Scope scope) {
-		scope.declarations.filter(typeof(EventDefinition))
-	}
-
-	def getOperations(Scope it) {
-		declarations.filter(typeof(OperationDefinition));
-	}
-
-	def hasOperations(Scope it) {
-		!operations.isEmpty;
-	}
-
-	def dispatch scope(Property it) {
-		if (eContainer instanceof InterfaceScope)
-			eContainer as InterfaceScope
-		else
-			null
-	}
-
-	def dispatch scope(Event it) {
-		if (eContainer instanceof InterfaceScope)
-			eContainer as InterfaceScope
-		else
-			null
-	}
-
-	def dispatch scope(OperationDefinition it) {
-		if (eContainer instanceof InterfaceScope)
-			eContainer as InterfaceScope
-		else
-			null
-	}
-
-	def needsAssignMethod(Property property) {
-		property.flow.eAllContents.filter(typeof(AssignmentExpression)).fold(new HashSet<Property>, [ l, e |
-			if (e.eContainer instanceof Expression && e.varRef.definition instanceof Property) {
-				l += e.varRef.definition as Property
-			}
-			l
-		]).contains(property)
-	}
-}

+ 2 - 1
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/Statemachine.xtend

@@ -23,6 +23,7 @@ import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.Step
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.extensions.StateVectorExtensions
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.stext.stext.EventDefinition
@@ -36,7 +37,7 @@ class Statemachine {
 	@Inject protected extension Naming
 	@Inject protected extension JavaNamingService
 	@Inject protected extension GenmodelEntries
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ICodegenTypeSystemAccess
 	@Inject protected extension ITypeSystem
 	@Inject protected extension FlowCode

+ 4 - 2
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/StatemachineInterface.xtend

@@ -18,20 +18,22 @@ import org.yakindu.base.types.typesystem.ITypeSystem
 import org.yakindu.sct.generator.core.library.ICoreLibraryHelper
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.sgraph.Scope
 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.VariableDefinition
-import static org.yakindu.sct.generator.core.filesystem.ISCTFileSystemAccess.*;
+
+import static org.yakindu.sct.generator.core.filesystem.ISCTFileSystemAccess.*
 
 class StatemachineInterface {
 
 	@Inject extension Naming
 	@Inject extension JavaNamingService
 	@Inject extension GenmodelEntries
-	@Inject extension Navigation
+	@Inject extension SExecExtensions
 	@Inject extension ITypeSystem
 	@Inject extension ICodegenTypeSystemAccess
 	@Inject extension JavaExpressionsGenerator

+ 5 - 5
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/wrappers/CycleBasedSynchronizedWrapper.xtend

@@ -16,16 +16,16 @@ import org.yakindu.base.types.Direction
 import org.yakindu.base.types.typesystem.GenericTypeSystem
 import org.yakindu.base.types.typesystem.ITypeSystem
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
+import org.yakindu.sct.generator.java.GenmodelEntries
+import org.yakindu.sct.generator.java.JavaNamingService
+import org.yakindu.sct.generator.java.Naming
 import org.yakindu.sct.generator.java.features.CycleBasedWrapperFeature
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.stext.stext.InterfaceScope
 
 import static org.eclipse.xtext.util.Strings.*
-import org.yakindu.sct.generator.java.GenmodelEntries
-import org.yakindu.sct.generator.java.JavaNamingService
-import org.yakindu.sct.generator.java.Naming
-import org.yakindu.sct.generator.java.Navigation
 
 /**
  * Generates the cycle bases synchronized wrapper for the state machine.
@@ -37,7 +37,7 @@ class CycleBasedSynchronizedWrapper {
 
 	@Inject protected extension JavaNamingService
 	@Inject protected extension Naming
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ITypeSystem
 	@Inject protected extension ICodegenTypeSystemAccess
 

+ 5 - 5
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/wrappers/EventBasedRunnableWrapper.xtend

@@ -18,15 +18,15 @@ import org.yakindu.base.types.Direction
 import org.yakindu.base.types.typesystem.GenericTypeSystem
 import org.yakindu.base.types.typesystem.ITypeSystem
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
+import org.yakindu.sct.generator.java.GenmodelEntries
+import org.yakindu.sct.generator.java.JavaNamingService
+import org.yakindu.sct.generator.java.Naming
 import org.yakindu.sct.generator.java.features.CycleBasedWrapperFeature
 import org.yakindu.sct.generator.java.features.EventBasedRunnableFeature
 import org.yakindu.sct.model.sexec.ExecutionFlow
+import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.stext.stext.InterfaceScope
-import org.yakindu.sct.generator.java.GenmodelEntries
-import org.yakindu.sct.generator.java.Naming
-import org.yakindu.sct.generator.java.JavaNamingService
-import org.yakindu.sct.generator.java.Navigation
 
 /**
  * Generates the runnable wrapper for the state machine. This wrapper implies event based execution semantics.
@@ -39,7 +39,7 @@ class EventBasedRunnableWrapper {
 
 	@Inject protected extension Naming
 	@Inject protected extension JavaNamingService
-	@Inject protected extension Navigation
+	@Inject protected extension SExecExtensions
 	@Inject protected extension ITypeSystem
 	@Inject protected extension ICodegenTypeSystemAccess
 	

+ 137 - 40
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/extensions/SExecExtensions.xtend

@@ -11,14 +11,18 @@
 package org.yakindu.sct.model.sexec.extensions
 
 import java.util.ArrayList
+import java.util.HashSet
 import java.util.List
 import org.eclipse.emf.ecore.EObject
+import org.eclipse.xtext.EcoreUtil2
+import org.yakindu.base.expressions.expressions.AssignmentExpression
 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.types.Declaration
 import org.yakindu.base.types.Direction
 import org.yakindu.base.types.Event
+import org.yakindu.base.types.Property
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.ExecutionNode
@@ -31,6 +35,7 @@ import org.yakindu.sct.model.sexec.Step
 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.ImportScope
 import org.yakindu.sct.model.stext.stext.InterfaceScope
 import org.yakindu.sct.model.stext.stext.InternalScope
 import org.yakindu.sct.model.stext.stext.OperationDefinition
@@ -38,6 +43,9 @@ import org.yakindu.sct.model.stext.stext.StatechartScope
 import org.yakindu.sct.model.stext.stext.VariableDefinition
 
 class SExecExtensions {
+	def <T extends EObject> T eContainerOfType(EObject eObject, Class<T> type) {
+		EcoreUtil2.getContainerOfType(eObject, type)
+	}
 	
 	def isDefaultInterface(StatechartScope scope) {
 		switch scope {
@@ -46,37 +54,81 @@ class SExecExtensions {
 		}
 	}
 	
-	def ExecutionFlow flow(EObject element){
-		var ExecutionFlow ret = null;
-		if (element !== null) {
-			if (element instanceof ExecutionFlow) {
-				return element as ExecutionFlow
-			}
-			else {
-				ret = flow(element.eContainer)
-			}
-		}
-		return ret;
+	def ExecutionFlow flow(EObject it){
+		eContainerOfType(ExecutionFlow)
+	}
+	
+	def Scope scope(Declaration it) {
+		if (eContainer instanceof Scope) eContainer as Scope
+		else null
+	}
+	
+	def InterfaceScope getInterfaceScope(EObject it) {
+		eContainerOfType(InterfaceScope)
+	}
+	
+	def operations(ExecutionFlow it) {
+		scopes.map[operations].flatten
+	}
+	
+	def Scope getTimeEventScope(ExecutionFlow it) {
+		return 	scopes.filter[declarations.filter(TimeEvent).size > 0].head
 	}
 	
 	def isTimed (ExecutionFlow it) {
-		scopes.filter[declarations.filter( typeof(TimeEvent) ).size > 0].size > 0
+		!timeEvents.empty
+	}
+	
+	def getStatechartScopes(ExecutionFlow it) {
+		scopes.filter(StatechartScope)
+	}
+	
+	def operations(Scope it) {
+		declarations.filter(OperationDefinition);
+	}
+	
+	def hasOperations(Scope it) {
+		!operations.isEmpty;
+	}
+	
+	def indexOf(TimeEvent it) {
+		scope.declarations.filter(TimeEvent).toList.indexOf(it);
+	}
+	
+	def getInterfaces(ExecutionFlow it) {
+		scopes.filter(StatechartScope).filter[!(it instanceof ImportScope)]
 	}
 	
 	def hasOperationCallbacks (ExecutionFlow it){
-		scopes.filter[declarations.filter( typeof(OperationDefinition) ).size > 0].size > 0
+		scopes.filter[declarations.filter(OperationDefinition).size > 0].size > 0
 	}
 	
 	def getTimeEvents(ExecutionFlow it) {
-		scopes.fold(new ArrayList<TimeEvent>, [l, s | l += s.declarations.filter(typeof(TimeEvent)) l])
+		scopes.map[declarations.filter(TimeEvent)].flatten.toList
+	}
+	
+	def getTimeEvent(ExecutionFlow flow, String timeEventName) {
+		flow.timeEvents.findFirst[name.compareTo(timeEventName) == 0]
 	}
 	
 	def hasValue (EventDefinition it) {
 		type !== null && type.name != 'void'
 	}
 	
+	/**
+	 * @deprecated use {@link #hasInternalScope(ExecutionFlow) hasInternalScope} instead
+	 */
+	@Deprecated
 	def boolean hasLocalScope(ExecutionFlow it) {
-		return internalScope !== null;
+		hasInternalScope
+	}
+	
+	def boolean hasInternalScope(ExecutionFlow it) {
+		internalScope !== null;
+	}
+	
+	def getInternalScope(ExecutionFlow it) {
+		it.scopes.filter(typeof(InternalScope)).head
 	}
 	
 	def hasHistory(ExecutionFlow it) {
@@ -87,16 +139,50 @@ class SExecExtensions {
 		!outgoingEvents.empty
 	}
 	
+	def hasOutgoingEvents(ExecutionFlow it) {
+		!outgoingEvents.empty
+	}
+	
+	def getInternalScopeEvents(ExecutionFlow flow) {
+		flow.internalScopes.map[eventDefinitions].flatten
+	}
+
+	def getInternalScopeVariables(ExecutionFlow flow) {
+		val variables = new ArrayList<VariableDefinition>
+		flow.internalScopes.forEach[variables.addAll(variableDefinitions)]
+		return variables
+	}
+	
+	def getEventDefinitions(Scope scope) {
+		scope.declarations.filter(typeof(EventDefinition))
+	}
+	
+	def boolean hasEvents(Scope it) {
+		return !eventDefinitions.empty
+	}
+	
+	def boolean hasEvents(ExecutionFlow it) {
+		return !getAllEvents.empty
+	}
+	
+	def getAllEvents(ExecutionFlow it) {
+		return scopes.map[eventDefinitions].flatten
+	}
+	
 	def hasLocalEvents(ExecutionFlow it) {
-		return hasLocalScope && !internalScope.localEvents.empty
+		return hasInternalScope && !internalScope.localEvents.empty
 	}
 	
 	def hasLocalEventsWithValue(ExecutionFlow it) {
-		return hasLocalScope && !internalScope.localEvents.filter[hasValue].empty
+		return hasInternalScope && !internalScope.localEvents.filter[hasValue].empty
 	}
 	
 	def getOutgoingEvents(Scope it) {
-		declarations.filter(typeof(EventDefinition)).filter[direction == Direction::OUT].fold(new ArrayList<EventDefinition>, [l, ev | l += ev l])
+		eventDefinitions.filter[isOutEvent]
+	}
+	
+	def Iterable<EventDefinition> getOutgoingEvents(ExecutionFlow it) {
+		scopes.map[outgoingEvents].flatten
 	}
 	
 	def hasIncomingEvents(Scope it) {
@@ -104,23 +190,40 @@ class SExecExtensions {
 	}
 		
 	def List<EventDefinition> getIncomingEvents(Scope it) {
-		declarations.filter(typeof(EventDefinition)).filter[direction == Direction::IN].fold(new ArrayList<EventDefinition>, [l, ev | l += ev l])
+		declarations.filter(typeof(EventDefinition)).filter[isInEvent].toList
 	}
 	
 	def List<EventDefinition> getLocalEvents(Scope it) {
-		declarations.filter(typeof(EventDefinition)).filter[direction == Direction::LOCAL].fold(new ArrayList<EventDefinition>, [l, ev | l += ev l])
+		declarations.filter(typeof(EventDefinition)).filter[isLocalEvent].toList
+	}
+	
+	def boolean isLocalEvent(EventDefinition it) {
+		direction === Direction::LOCAL
+	}
+	
+	def boolean isOutEvent(EventDefinition it) {
+		direction === Direction::OUT
+	}
+	
+	def boolean isInEvent(EventDefinition it) {
+		direction === Direction::IN
 	}
 	
 	def getInterfaceScopes(ExecutionFlow it) {
 		scopes.filter(typeof(InterfaceScope))
 	}
 	
+	def Iterable<InternalScope> getInternalScopes(ExecutionFlow it) {
+		return scopes.filter(typeof(InternalScope))
+	}
+	
+	def getDefaultScope(ExecutionFlow it) {
+		interfaceScopes.filter[isDefaultInterface].head
+	}
+	
 	def getVariableDefinitions(Scope it) {
 		declarations.filter(typeof(VariableDefinition))
 	} 
-	def getInternalScope(ExecutionFlow it) {
-		it.scopes.filter(typeof(InternalScope)).head
-	}
 	
 	def dispatch definition(ElementReferenceExpression it) {
 		if (reference instanceof Declaration) reference as Declaration
@@ -132,8 +235,16 @@ class SExecExtensions {
 		null
 	}
 	
+	def needsAssignMethod(Property property) {
+		property.flow.eAllContents.filter(AssignmentExpression)
+			.filter[eContainer instanceof Expression 
+				&& varRef.definition instanceof Property
+			]
+			.findFirst[(varRef.definition as Property).equals(property)] !== null
+	}
+	
 	def Event event(Declaration it) {
-		if ( it instanceof Event ) it as Event else null 	
+		if (it instanceof Event) it as Event else null 	
 	}
 
 	def dispatch List<ExecutionState> subStates(ExecutionState it) {
@@ -301,14 +412,7 @@ class SExecExtensions {
 	 * 		The super ExecutionScope or null
 	 */
 	def ExecutionScope parentExecutionScope(EObject it) {
-		if (it !== null) {
-			if (it instanceof ExecutionScope) {
-				return it as ExecutionScope
-			} else {
-				return parentExecutionScope(it.eContainer)
-			}
-		}
-		return null
+		eContainerOfType(ExecutionScope)
 	}
 	
 	/**
@@ -335,7 +439,7 @@ class SExecExtensions {
 		if (it instanceof ExecutionFlow) {
 			return 0
 		} else {
-			scopeDepth = superScope.getScopeDepth + 1
+			scopeDepth = superScope.scopeDepth + 1
 		}
 		return scopeDepth
 	}
@@ -354,11 +458,4 @@ class SExecExtensions {
 		functions.addAll(reactFunctions)
 		return functions
 	}
-	
-	def getTimeEvent(ExecutionFlow flow, String timeEventName) {
-		flow.timeEvents.findFirst[name.compareTo(timeEventName) == 0]
-	}
-	
-		
-	
 }