Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rentz-Reichert2012-07-02 16:19:11 +0000
committerHenrik Rentz-Reichert2012-07-02 16:19:11 +0000
commit618ecb25c890e060d3f395de8b02eb7e5b1f58d1 (patch)
treeba526c7390152ff308561f16fca7e4d506ed9b18 /plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/generic/GenericStateMachineGenerator.xtend
parent69ed820ce1e4ca72eca92461209276cf4cea8fa3 (diff)
downloadorg.eclipse.etrice-618ecb25c890e060d3f395de8b02eb7e5b1f58d1.tar.gz
org.eclipse.etrice-618ecb25c890e060d3f395de8b02eb7e5b1f58d1.tar.xz
org.eclipse.etrice-618ecb25c890e060d3f395de8b02eb7e5b1f58d1.zip
[core.room, genmodel, ui.behavior] introduced ExpandedRefinedState in genmodel to cope with inherited action code
Diffstat (limited to 'plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/generic/GenericStateMachineGenerator.xtend')
-rw-r--r--plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/generic/GenericStateMachineGenerator.xtend63
1 files changed, 48 insertions, 15 deletions
diff --git a/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/generic/GenericStateMachineGenerator.xtend b/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/generic/GenericStateMachineGenerator.xtend
index e77d2e783..ca24088a2 100644
--- a/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/generic/GenericStateMachineGenerator.xtend
+++ b/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/generic/GenericStateMachineGenerator.xtend
@@ -23,6 +23,7 @@ import org.eclipse.etrice.core.room.GuardedTransition
import org.eclipse.etrice.core.room.TriggeredTransition
import org.eclipse.etrice.core.room.NonInitialTransition
import org.eclipse.etrice.core.genmodel.etricegen.ExpandedActorClass
+import org.eclipse.etrice.core.genmodel.etricegen.ExpandedRefinedState
import org.eclipse.etrice.core.genmodel.etricegen.ActiveTrigger
import org.eclipse.etrice.generator.generic.RoomExtensions
import org.eclipse.etrice.generator.base.DetailCodeTranslator
@@ -113,21 +114,7 @@ class GenericStateMachineGenerator {
/* Entry and Exit Codes */
«FOR state : xpac.stateMachine.getStateList()»
«IF !langExt.usesInheritance || xpac.isOwnObject(state)»
- «IF state.hasEntryCode()»
- «langExt.accessLevelProtected»void «state.getEntryCodeOperationName()»(«langExt.selfPointer(ac.name, false)») {
- «xpac.getEntryCode(state, dct)»
- }
- «ENDIF»
- «IF state.hasExitCode()»
- «langExt.accessLevelProtected»void «state.getExitCodeOperationName()»(«langExt.selfPointer(ac.name, false)») {
- «xpac.getExitCode(state, dct)»
- }
- «ENDIF»
- «IF state.hasDoCode()»
- static void «state.getDoCodeOperationName()»(«langExt.selfPointer(ac.name, false)») {
- «xpac.getDoCode(state, dct)»
- }
- «ENDIF»
+ «xpac.genActionCodeMethods(state, dct)»
«ENDIF»
«ENDFOR»
@@ -369,4 +356,50 @@ class GenericStateMachineGenerator {
«ENDIF»
'''}
+ def private genActionCodeMethods(ExpandedActorClass xpac, State state, DetailCodeTranslator dct) {
+ val selfPtr = langExt.selfPointer(xpac.actorClass.name, false)
+ val entryOp = state.getEntryCodeOperationName()
+ val exitOp = state.getExitCodeOperationName()
+ val doOp = state.getDoCodeOperationName()
+ var entry = dct.translateDetailCode(state.entryCode)
+ var exit = dct.translateDetailCode(state.exitCode)
+ var docode = dct.translateDetailCode(state.doCode)
+ if (state instanceof ExpandedRefinedState) {
+ val rs = state as ExpandedRefinedState
+ if (langExt.usesInheritance) {
+ // we call the super method in the generated code
+ val baseName = xpac.actorClass.base.name
+ if (!rs.inheritedEntry.empty)
+ entry = langExt.superCall(baseName, entryOp, "") + entry
+ if (!rs.inheritedExit.empty)
+ exit = exit + langExt.superCall(baseName, exitOp, "")
+ if (!rs.inheritedDo.empty)
+ docode = langExt.superCall(baseName, doOp, "") + docode
+ }
+ else {
+ // the inherited code is added directly
+ entry = rs.inheritedEntry + entry
+ exit = exit + rs.inheritedExit
+ docode = rs.inheritedDo + docode
+ }
+ }
+ '''
+ «IF !entry.empty»
+ «langExt.accessLevelProtected»void «entryOp»(«selfPtr») {
+ «entry»
+ }
+ «ENDIF»
+ «IF !exit.empty»
+ «langExt.accessLevelProtected»void «exitOp»(«selfPtr») {
+ «exit»
+ }
+ «ENDIF»
+ «IF !docode.empty»
+ «langExt.accessLevelProtected» void «doOp»(«selfPtr») {
+ «docode»
+ }
+ «ENDIF»
+ '''
+ }
+
} \ No newline at end of file

Back to the top