diff options
author | Henrik Rentz-Reichert | 2017-11-06 10:37:41 +0000 |
---|---|---|
committer | Henrik Rentz-Reichert | 2017-11-07 06:58:06 +0000 |
commit | 48d51b2b32f759e255f0cca154d2757c95d15e19 (patch) | |
tree | f1455e17e092e88c01feac4b6cf7f5ec2d2896ff /plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java | |
parent | b09856b29bfcaea08e9e57b14da3744c0a201867 (diff) | |
download | org.eclipse.etrice-48d51b2b32f759e255f0cca154d2757c95d15e19.tar.gz org.eclipse.etrice-48d51b2b32f759e255f0cca154d2757c95d15e19.tar.xz org.eclipse.etrice-48d51b2b32f759e255f0cca154d2757c95d15e19.zip |
Bug 511330 - [core.genmodel.fsm] introduce simplified generator model
for state machines
* manually merged newfsmgen to newfsmgen_finalize because no rebase was
possible due to structural changes
* rebased on master
* switch to Oxygen and Xtend 2.12
Change-Id: If9a8c7421f07fb8e8fa824b7bc6761b9142b7eaf
Diffstat (limited to 'plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java')
6 files changed, 69 insertions, 47 deletions
diff --git a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/ActorClassGen.xtend b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/ActorClassGen.xtend index d573ba315..1bfae882e 100644 --- a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/ActorClassGen.xtend +++ b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/ActorClassGen.xtend @@ -32,6 +32,7 @@ import org.eclipse.etrice.generator.generic.ProcedureHelpers import org.eclipse.etrice.generator.generic.RoomExtensions import org.eclipse.etrice.generator.generic.TypeHelpers import org.eclipse.etrice.generator.java.Main +import static extension org.eclipse.etrice.core.genmodel.fsm.FsmGenExtensions.* @Singleton class ActorClassGen extends GenericActorClassGenerator { @@ -279,7 +280,7 @@ class ActorClassGen extends GenericActorClassGenerator { public abstract void executeInitTransition(); «ELSE» «IF ac.hasNonEmptyStateMachine» - «xpac.genStateMachine()» + «xpac.graphContainer.genStateMachine» «IF ac.commType == ComponentCommunicationType::DATA_DRIVEN» public void receiveEvent(InterfaceItemBase ifitem, int evt, Object generic_data) { handleSystemEvent(ifitem, evt, generic_data); @@ -295,7 +296,7 @@ class ActorClassGen extends GenericActorClassGenerator { «ENDIF» } «ENDIF» - «ELSEIF xpac.stateMachine.empty» + «ELSEIF xpac.graphContainer.graph.empty» ««« no state machine in the super classes //--------------------- no state machine public void receiveEvent(InterfaceItemBase ifitem, int evt, Object data) { @@ -310,7 +311,7 @@ class ActorClassGen extends GenericActorClassGenerator { @Override public void saveObject(ObjectOutput output) throws IOException { - «IF xpac.hasStateMachine()» + «IF !xpac.graphContainer.graph.empty» // state and history output.writeInt(getState()); for (int h: history) output.writeInt(h); @@ -325,7 +326,7 @@ class ActorClassGen extends GenericActorClassGenerator { @Override public void loadObject(ObjectInput input) throws IOException, ClassNotFoundException { - «IF xpac.hasStateMachine()» + «IF !xpac.graphContainer.graph.empty» // state and history setState(input.readInt()); for (int i=0; i<history.length; ++i) history[i] = input.readInt(); diff --git a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/JavaExtensions.xtend b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/JavaExtensions.xtend index 440c3e8d0..2de886d0c 100644 --- a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/JavaExtensions.xtend +++ b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/JavaExtensions.xtend @@ -20,8 +20,14 @@ package org.eclipse.etrice.generator.java.gen import com.google.inject.Inject import com.google.inject.Singleton import java.util.List +import org.eclipse.emf.ecore.EObject +import org.eclipse.etrice.core.etphys.eTPhys.NodeRef +import org.eclipse.etrice.core.genmodel.etricegen.SubSystemInstance +import org.eclipse.etrice.core.room.ActorClass import org.eclipse.etrice.core.room.Attribute import org.eclipse.etrice.core.room.DataType +import org.eclipse.etrice.core.room.EnumLiteral +import org.eclipse.etrice.core.room.EnumerationType import org.eclipse.etrice.core.room.ExternalType import org.eclipse.etrice.core.room.Message import org.eclipse.etrice.core.room.PrimitiveType @@ -30,22 +36,15 @@ import org.eclipse.etrice.core.room.VarDecl import org.eclipse.etrice.generator.generic.ILanguageExtension import org.eclipse.etrice.generator.generic.TypeHelpers import org.eclipse.xtext.util.Pair -import org.eclipse.etrice.core.genmodel.etricegen.SubSystemInstance -import org.eclipse.etrice.core.etphys.eTPhys.NodeRef -import org.eclipse.etrice.core.room.ActorClass -import org.eclipse.etrice.core.room.EnumerationType - -import org.eclipse.etrice.core.room.EnumLiteral -import org.eclipse.emf.ecore.EObject @Singleton class JavaExtensions implements ILanguageExtension { - + @Inject TypeHelpers typeHelpers override String getTypedDataDefinition(EObject msg) { if (msg instanceof Message) { - generateArglistAndTypedData((msg as Message).data).get(1) + generateArglistAndTypedData((msg as Message).data).get(TypedDataKind.DECLARATION_AND_INITIALIZATION.ordinal) } else { "" @@ -171,7 +170,7 @@ class JavaExtensions implements ILanguageExtension { v = v.substring(type.name.length+1) for(EnumLiteral l : type.literals) if(l.name.equals(v)) - return type.getName()+"."+l.getName() + return type.name+"."+l.name } def private castValue(PrimitiveType type, String value){ @@ -209,7 +208,7 @@ class JavaExtensions implements ILanguageExtension { PrimitiveType: toValueLiteral(dt, dt.defaultValueLiteral) EnumerationType: - getDefaultValue(dt) + dt.defaultValue ExternalType: "new "+(dt as ExternalType).targetName+"()" default: @@ -246,11 +245,11 @@ class JavaExtensions implements ILanguageExtension { return newArrayList("", "", "") val data = d as VarDecl - var typeName = data.refType.type.getName(); - var castTypeName = typeName; + var typeName = data.refType.type.name + var castTypeName = typeName if (data.refType.type instanceof PrimitiveType) { - typeName = (data.refType.type as PrimitiveType).getTargetName() - val ct = (data.refType.type as PrimitiveType).getCastName() + typeName = (data.refType.type as PrimitiveType).targetName + val ct = (data.refType.type as PrimitiveType).castName if (ct!=null && !ct.isEmpty()) castTypeName = ct } @@ -259,16 +258,16 @@ class JavaExtensions implements ILanguageExtension { castTypeName = (data.refType.type as EnumerationType).castType } - val typedData = typeName+" "+data.getName() + " = ("+castTypeName+") generic_data__et;\n"; - val dataArg = ", "+data.getName(); - val typedArgList = ", "+typeName+" "+data.getName(); + val dataArg = ", " + GENERIC_DATA_NAME + val typedData = typeName + " " + GENERIC_DATA_NAME + " = ("+castTypeName+") generic_data__et;\n" + val typedArgList = ", " + typeName + " " + GENERIC_DATA_NAME - return newArrayList(dataArg, typedData, typedArgList); + return newArrayList(dataArg, typedData, typedArgList) } override getTargetType(EnumerationType type) { - if (type.getPrimitiveType()!=null) - type.getPrimitiveType().getTargetName() + if (type.primitiveType!=null) + type.primitiveType.targetName else "int" } @@ -278,14 +277,14 @@ class JavaExtensions implements ILanguageExtension { val cast = type.targetType if (type.primitiveType==null) - Long.toString(literal.getLiteralValue()) + Long.toString(literal.literalValue) else - "(("+cast+")"+Long.toString(literal.getLiteralValue())+")" + "(("+cast+")"+Long.toString(literal.literalValue)+")" } override getCastType(EnumerationType type) { - if (type.getPrimitiveType()!=null) - type.getPrimitiveType().getCastName() + if (type.primitiveType!=null) + type.primitiveType.castName else "int" } diff --git a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/NodeGen.xtend b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/NodeGen.xtend index 793c38e3e..67e516e5d 100644 --- a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/NodeGen.xtend +++ b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/NodeGen.xtend @@ -22,7 +22,6 @@ import org.eclipse.etrice.core.etphys.eTPhys.ExecMode import org.eclipse.etrice.core.etphys.eTPhys.PhysicalThread import org.eclipse.etrice.core.genmodel.etricegen.ActorInstance import org.eclipse.etrice.core.genmodel.etricegen.ActorInterfaceInstance -import org.eclipse.etrice.core.genmodel.fsm.fsmgen.IDiagnostician import org.eclipse.etrice.core.genmodel.etricegen.InstanceBase import org.eclipse.etrice.core.genmodel.etricegen.Root import org.eclipse.etrice.core.genmodel.etricegen.StructureInstance @@ -43,6 +42,7 @@ import static extension org.eclipse.etrice.generator.fsm.base.Indexed.* import com.google.common.collect.Lists import com.google.common.collect.Sets import org.eclipse.etrice.core.genmodel.builder.GenmodelConstants +import org.eclipse.etrice.core.genmodel.fsm.IDiagnostician @Singleton class NodeGen { diff --git a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/ProtocolClassGen.xtend b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/ProtocolClassGen.xtend index 9bb517b43..d59287f5a 100644 --- a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/ProtocolClassGen.xtend +++ b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/ProtocolClassGen.xtend @@ -14,7 +14,6 @@ package org.eclipse.etrice.generator.java.gen import com.google.inject.Inject import com.google.inject.Singleton -import org.eclipse.etrice.core.genmodel.fsm.base.ILogger import org.eclipse.etrice.core.genmodel.etricegen.Root import org.eclipse.etrice.core.room.CommunicationType import org.eclipse.etrice.core.room.DataClass @@ -27,6 +26,7 @@ import org.eclipse.etrice.generator.generic.ProcedureHelpers import org.eclipse.etrice.generator.generic.RoomExtensions import org.eclipse.etrice.generator.generic.TypeHelpers import org.eclipse.etrice.generator.java.Main +import org.eclipse.etrice.core.genmodel.fsm.ILogger @Singleton class ProtocolClassGen extends GenericProtocolClassGenerator { diff --git a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/StateMachineGen.xtend b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/StateMachineGen.xtend index f2e971d2c..b2910ad5a 100644 --- a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/StateMachineGen.xtend +++ b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/StateMachineGen.xtend @@ -13,37 +13,35 @@ package org.eclipse.etrice.generator.java.gen import com.google.inject.Singleton -import java.util.ArrayList -import org.eclipse.etrice.core.genmodel.etricegen.ExpandedActorClass +import java.util.Comparator import org.eclipse.etrice.core.fsm.fSM.State +import org.eclipse.etrice.core.genmodel.etricegen.ExpandedActorClass +import org.eclipse.etrice.core.genmodel.fsm.fsmgen.GraphContainer +import org.eclipse.etrice.core.genmodel.fsm.fsmgen.Node import org.eclipse.etrice.generator.generic.GenericStateMachineGenerator import org.eclipse.etrice.generator.java.Main -import org.eclipse.etrice.core.genmodel.fsm.fsmgen.ExpandedModelComponent + +import static extension org.eclipse.etrice.core.genmodel.fsm.FsmGenExtensions.* @Singleton class StateMachineGen extends GenericStateMachineGenerator { + val nodeComparator = new NodeComparator + /** * @param generateImplementation NOT used */ - override genExtra(ExpandedModelComponent xpac, boolean generateImplementation) { - val states = new ArrayList<State>() - var ac = xpac.modelComponent + override genExtra(GraphContainer gc, boolean generateImplementation) { + val orderedStateNodes = gc.graph.allStateNodes.toList.sortWith(nodeComparator) -// it is crucial that we obey the order that is used for state IDs -// that means we have to collect base classes first and each base class list with leaf states last - while (ac!=null) { - states.addAll(0, ac.allBaseStates.leafStatesLast) - ac = ac.base - } ''' «IF Main::settings.generateMSCInstrumentation || Main::settings.generateWithVerboseOutput» // state names protected static final String stateStrings[] = { "<no state>", "<top>", - «FOR state : states SEPARATOR ","» - "«state.genStatePathName»" + «FOR node : orderedStateNodes SEPARATOR ","» + "«(node.stateGraphNode as State).genStatePathName»" «ENDFOR» }; @@ -54,7 +52,7 @@ class StateMachineGen extends GenericStateMachineGenerator { ««« history[i] = NO_STATE; ««« } // history - protected int history[] = {NO_STATE, NO_STATE«FOR state : states», NO_STATE«ENDFOR»}; + protected int history[] = {NO_STATE, NO_STATE«FOR state : orderedStateNodes», NO_STATE«ENDFOR»}; private void setState(int new_state) { «IF Main::settings.generateMSCInstrumentation» @@ -84,4 +82,28 @@ class StateMachineGen extends GenericStateMachineGenerator { def getHistorySize(ExpandedActorClass xpac) { xpac.actorClass.getAllBaseStates().size+2 } + + private static class NodeComparator implements Comparator<Node> { + + // it is crucial that we obey the order that is used for state IDs + // that means we have to collect base classes first and each base class list with leaf states last + override int compare(Node o1, Node o2) { + if (o1.inheritanceLevel==o2.inheritanceLevel) { + if (o1.isLeaf && o2.isLeaf) { + return 0 + } + if (o1.isLeaf) { + return 1 + } + if (o2.isLeaf) { + return -1 + } + return 0 + } + else { + return Integer.compare(o1.inheritanceLevel, o1.inheritanceLevel) + } + } + + } } diff --git a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/Validator.java b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/Validator.java index 7123338d1..9a4b5e5c0 100644 --- a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/Validator.java +++ b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/Validator.java @@ -13,7 +13,7 @@ package org.eclipse.etrice.generator.java.gen; import org.eclipse.etrice.core.genmodel.etricegen.Root; -import org.eclipse.etrice.core.genmodel.fsm.base.ILogger; +import org.eclipse.etrice.core.genmodel.fsm.ILogger; import com.google.inject.Inject; |