Переглянути джерело

Refactoring of Java generator to support new type system

markus.muehlbrandt@itemis.de 13 роки тому
батько
коміт
66de3997fd

+ 1 - 1
plugins/org.yakindu.sct.generator.java/.settings/org.eclipse.xtend.shared.ui.prefs

@@ -1,3 +1,3 @@
+#Thu Dec 22 16:18:38 CET 2011
 eclipse.preferences.version=1
 project.specific.metamodel=true
-metamodelContributor=org.eclipse.xtend.typesystem.emf.ui.EmfMetamodelContributor

+ 2 - 1
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/CustomCycleBasedStatemachine.xpt

@@ -12,6 +12,7 @@ Contributors:
 «IMPORT stext»
 
 «EXTENSION org::yakindu::sct::generator::java::templates::ExecutionModelExtensions»
+«EXTENSION org::yakindu::sct::generator::java::templates::TypeModelExtensions»
 «EXTENSION org::yakindu::sct::generator::java::templates::Expression»
 «EXTENSION org::yakindu::sct::generator::java::templates::GenmodelEntries»
 «EXTENSION org::yakindu::sct::generator::java::templates::Naming»
@@ -300,7 +301,7 @@ public class 
 	«REM»create getters and setters for events«ENDREM»
 	«FOREACH getInternalScopeEvents() AS event-»
 	
-		«IF event.type != Type::void
+		«IF !event.type.isVoid()
 			private void raise«event.name.toFirstUpper()»(«event.type.getJavaType()» value) {
 				«event.getName()».setValue(value);
 				getOccuredEvents().add(«event.getName()»);

+ 2 - 1
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/CustomInterface.xpt

@@ -10,6 +10,7 @@ Contributors:
 «IMPORT stext»
 
 «EXTENSION org::yakindu::sct::generator::java::templates::ExecutionModelExtensions»
+«EXTENSION org::yakindu::sct::generator::java::templates::TypeModelExtensions»
 «EXTENSION org::yakindu::sct::generator::java::templates::Expression»
 «EXTENSION org::yakindu::sct::generator::java::templates::GenmodelEntries»
 «EXTENSION org::yakindu::sct::generator::java::templates::Naming»
@@ -42,7 +43,7 @@ public interface 
 	
 	«FOREACH declarations.typeSelect(EventDefinition) AS event-»
 	«IF  event.direction ==  Direction::IN-»
-		«IF event.type != Type::void
+		«IF !event.type.isVoid()
 			public void raise«event.name.toFirstUpper()»(«event.type.getJavaType()» value);
 		«ELSE»
 			public void raise«event.name.toFirstUpper()»();

+ 3 - 1
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/CustomInterfaceImpl.xpt

@@ -8,8 +8,10 @@ Contributors:
 	Markus Muehlbrandt - Initial contribution and API
 «ENDREM»
 «IMPORT stext»
+«IMPORT types»
 
 «EXTENSION org::yakindu::sct::generator::java::templates::ExecutionModelExtensions»
+«EXTENSION org::yakindu::sct::generator::java::templates::TypeModelExtensions»
 «EXTENSION org::yakindu::sct::generator::java::templates::Expression»
 «EXTENSION org::yakindu::sct::generator::java::templates::GenmodelEntries»
 «EXTENSION org::yakindu::sct::generator::java::templates::Naming»
@@ -46,7 +48,7 @@ public class 
 		
 	«FOREACH declarations.typeSelect(EventDefinition) AS event-»
 	
-	«IF event.type != Type::void
+	«IF !event.type.isVoid()
 	public void raise«event.name.toFirstUpper()»(«event.type.getJavaType()» value) {
 		«event.getName()».setValue(value);
 		statemachine.getOccuredEvents().add(«event.getName()»);

+ 10 - 8
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/ExecutionModelExtensions.ext

@@ -11,21 +11,23 @@ import stext;
 import sexec;
 import sgraph;
 
+extension org::yakindu::sct::generator::java::templates::TypeModelExtensions;
+
 List getDeclaredVariables(ExecutionFlow flow) : flow.scopes.declarations.typeSelect(VariableDefinition);
 
 getInterfaceScope(ExecutionFlow this) : scopes.typeSelect(InterfaceScope);
 getInterfaceScopeDeclarations(ExecutionFlow this) : getInterfaceScope().declarations;
 getInterfaceScopeVariables(ExecutionFlow this) : getInterfaceScopeDeclarations().typeSelect(VariableDefinition);
 getInterfaceScopeEvents(ExecutionFlow this) : getInterfaceScopeDeclarations().typeSelect(EventDefinition);
-getInterfaceScopeVoidEvents(ExecutionFlow this) : getInterfaceScopeEvents().select(e|e.type==Type::void);
-getInterfaceScopeValuedEvents(ExecutionFlow this) : getInterfaceScopeEvents().select(e|e.type!=Type::void);
+getInterfaceScopeVoidEvents(ExecutionFlow this) : getInterfaceScopeEvents().select(e|e.type.isVoid());
+getInterfaceScopeValuedEvents(ExecutionFlow this) : getInterfaceScopeEvents().select(e|!e.type.isVoid());
 
 getInternalScope(ExecutionFlow this) : scopes.typeSelect(InternalScope);
 getInternalScopeDeclarations(ExecutionFlow this) : getInternalScope().declarations;
 getInternalScopeVariables(ExecutionFlow this) :	getInternalScopeDeclarations().typeSelect(VariableDefinition);
 getInternalScopeEvents(ExecutionFlow this) : getInternalScopeDeclarations().typeSelect(EventDefinition);
-getInternalScopeVoidEvents(ExecutionFlow this) :getInternalScopeEvents().select(e|e.type==Type::void);
-getInternalScopeValuedEvents(ExecutionFlow this) : getInternalScopeEvents().select(e|e.type!=Type::void);
+getInternalScopeVoidEvents(ExecutionFlow this) :getInternalScopeEvents().select(e|e.type.isVoid());
+getInternalScopeValuedEvents(ExecutionFlow this) : getInternalScopeEvents().select(e|!e.type.isVoid());
 
 getTimeEvents(ExecutionFlow this) : scopes.typeSelect(Scope).declarations.typeSelect(TimeEvent);
 
@@ -36,13 +38,13 @@ boolean hasOutgoingEvents(Scope this) :
 	!declarations.typeSelect(EventDefinition).select(event|event.direction == Direction::OUT).isEmpty;
 
 boolean hasOutgoingVoidEvents(Scope this) :
-	!declarations.typeSelect(EventDefinition).select(event|event.direction == Direction::OUT).select(event|event.type == Type::void).isEmpty;
+	!declarations.typeSelect(EventDefinition).select(event|event.direction == Direction::OUT).select(event|event.type.isVoid()).isEmpty;
 	
 boolean hasOutgoingValuedEvents(Scope this) :
-	!declarations.typeSelect(EventDefinition).select(event|event.direction == Direction::OUT).select(event|event.type != Type::void).isEmpty;
+	!declarations.typeSelect(EventDefinition).select(event|event.direction == Direction::OUT).select(event|!event.type.isVoid()).isEmpty;
 
 boolean hasEvents(Scope this) :
-	!declarations.typeSelect(EventDefinition).select(event|event.type == Type::void).isEmpty;
+	!declarations.typeSelect(EventDefinition).select(event|event.type.isVoid()).isEmpty;
 	
 boolean hasValuedEvents(Scope this) :
-	!declarations.typeSelect(EventDefinition).select(event|event.type != Type::void).isEmpty;
+	!declarations.typeSelect(EventDefinition).select(event|!event.type.isVoid()).isEmpty;

+ 24 - 49
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/Expression.ext

@@ -13,6 +13,7 @@ import sexec;
 import sgraph;
 
 extension org::yakindu::sct::generator::java::templates::Naming;
+extension org::yakindu::sct::generator::java::templates::TypeModelExtensions;
 
 String toCode(Void void) :
 	"/*toCode() called with NULL element. Polymorphic resolver could not match callable method!*/";
@@ -43,17 +44,17 @@ String setterCall(Assignment this, String expression) :
 /* Assignment */
 String toCode(Assignment this) :
   switch (operator) {
-  case (AssignmentOperator::assign) : setterCall(expression.toCode())
-  case (AssignmentOperator::multAssign) : setterCall(getterCall() + " * (" + expression.toCode() + ")")
-  case (AssignmentOperator::divAssign) : setterCall(getterCall() + " / (" + expression.toCode() + ")")
-  case (AssignmentOperator::modAssign) : setterCall(getterCall() + " % (" + expression.toCode() + ")")
-  case (AssignmentOperator::addAssign) : setterCall(getterCall() + " + (" + expression.toCode() + ")")
-  case (AssignmentOperator::subAssign) : setterCall(getterCall() + " - (" + expression.toCode() + ")")
-  case (AssignmentOperator::andAssign) : setterCall(getterCall() + " & (" + expression.toCode() + ")")
-  case (AssignmentOperator::xorAssign) : setterCall(getterCall() + " ^ (" + expression.toCode() + ")")
-  case (AssignmentOperator::orAssign) : setterCall(getterCall() + " ^ (" + expression.toCode() + ")")
-  case (AssignmentOperator::leftShiftAssign) : setterCall(getterCall() + " << ("+ expression.toCode() + ")")
-  case (AssignmentOperator::rightShiftAssign) : setterCall(getterCall() + " >> (" + expression.toCode() + ")")  
+  case AssignmentOperator::assign : setterCall(expression.toCode())
+  case AssignmentOperator::multAssign : setterCall(getterCall() + " * (" + expression.toCode() + ")")
+  case AssignmentOperator::divAssign : setterCall(getterCall() + " / (" + expression.toCode() + ")")
+  case AssignmentOperator::modAssign : setterCall(getterCall() + " % (" + expression.toCode() + ")")
+  case AssignmentOperator::addAssign : setterCall(getterCall() + " + (" + expression.toCode() + ")")
+  case AssignmentOperator::subAssign : setterCall(getterCall() + " - (" + expression.toCode() + ")")
+  case AssignmentOperator::andAssign : setterCall(getterCall() + " & (" + expression.toCode() + ")")
+  case AssignmentOperator::xorAssign : setterCall(getterCall() + " ^ (" + expression.toCode() + ")")
+  case AssignmentOperator::orAssign : setterCall(getterCall() + " ^ (" + expression.toCode() + ")")
+  case AssignmentOperator::leftShiftAssign : setterCall(getterCall() + " << ("+ expression.toCode() + ")")
+  case AssignmentOperator::rightShiftAssign : setterCall(getterCall() + " >> (" + expression.toCode() + ")")  
   default : ""
   };
 		
@@ -111,27 +112,27 @@ String toCode(ElementReferenceExpression exp) :
 
 String getOperator(AdditiveOperator operator) : 
     switch(operator) {
-    	case(AdditiveOperator::plus) : " + "
-    	case(AdditiveOperator::minus) : " - "
+    	case AdditiveOperator::plus : " + "
+    	case AdditiveOperator::minus : " - "
     	default : ""
     };
 
 String getOperator(MultiplicativeOperator operator) : 
     switch(operator) {
-    	case(MultiplicativeOperator::mul) : " * "
-    	case(MultiplicativeOperator::div) : " / "
-    	case(MultiplicativeOperator::mod) : " % "
+    	case MultiplicativeOperator::mul : " * "
+    	case MultiplicativeOperator::div : " / "
+    	case MultiplicativeOperator::mod : " % "
     	default : ""
     };
 
 String getOperator(RelationalOperator operator) :
 	switch (operator) {
-	  case (RelationalOperator::greater) : " > "
-	  case (RelationalOperator::greaterEqual) : " >= "
-	  case (RelationalOperator::smaller) : " < "
-	  case (RelationalOperator::smallerEqual) : " <= "
-	  case (RelationalOperator::equals) : " == "
-	  case (RelationalOperator::notEquals) : " != "
+	  case RelationalOperator::greater : " > "
+	  case RelationalOperator::greaterEqual : " >= "
+	  case RelationalOperator::smaller : " < "
+	  case RelationalOperator::smallerEqual : " <= "
+	  case RelationalOperator::equals : " == "
+	  case RelationalOperator::notEquals : " != "
 	  default : ""
 	};
 	
@@ -141,35 +142,9 @@ String toCode(EventRaising this) :
 	else
 		event.getContext().toFirstLower()+"raise"+event.name.toFirstUpper()+"();";
 		
-String getJavaType(Type type) :
-		switch (type) {
-		case (Type::real) : "double"
-		case (Type::integer) : "int"
-		case (Type::boolean) : "boolean"
-		case (Type::string) : "string"
-		default : ""
-		};
-		
-String getJavaClassType(Type type) :
-		switch (type) {
-		case (Type::real) : "Double"
-		case (Type::integer) : "Integer"
-		case (Type::boolean) : "Boolean"
-		case (Type::string) : "String"
-		case (Type::void) : "Void"
-		default : ""
-		};
-		
 String getInitialValue(EventDefinition this) :
 	if derivation != null then
 		derivation.condition.toCode()
 	else
 		//if no initial value expression is declared set default value to avoid npe exceptions
-		switch (type) {
-		case (Type::real) : "0D"
-		case (Type::integer) : "0"
-		case (Type::boolean) : "false"
-		case (Type::string) : ""
-		case (Type::void) : "null"
-		default : ""
-		};
+		type.getInitialValue();

+ 3 - 2
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/Naming.ext

@@ -16,6 +16,7 @@ import sgen;
 extension org::yakindu::sct::generator::java::templates::Expression;
 extension org::yakindu::sct::generator::java::templates::ExecutionModelExtensions;
 extension org::yakindu::sct::generator::java::templates::GenmodelEntries;
+extension org::yakindu::sct::generator::java::templates::TypeModelExtensions;
 
 String getStatemachineName(String name) :
 	JAVA org.yakindu.sct.generator.java.features.JavaFeatureConstants.getValidStatemachineName(java.lang.String);
@@ -48,13 +49,13 @@ String getInterfaceParameter(InterfaceScope this) :
 		null;
 
 String getCreationSignature(EventDefinition this) :
-	if type == Type::void then
+	if type.isVoid() then
 		"Events."+name.toFirstUpper()
 	else
 		"Events."+name.toFirstUpper()+", "+getInitialValue();
 
 String getEventType(EventDefinition this) :
-	if type == Type::void then
+	if type.isVoid() then
 		"Event<Events>"
 	else
 		"ValuedEvent<Events, "+type.getJavaClassType()+">";

+ 44 - 0
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/TypeModelExtensions.ext

@@ -0,0 +1,44 @@
+/*
+  Copyright (c) 2011 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:
+  	Markus Muehlbrandt - Initial contribution and API
+ */
+import types;
+
+boolean isVoid(Type this) :
+	name == null || name == "void";
+	
+String getJavaType(Type this) :
+		switch (name) {
+		case "real" : "double"
+		case "integer" : "int"
+		case "boolean" : "boolean"
+		case "string" : "string"
+		default : ""
+		};
+		
+String getJavaClassType(Type this) :
+		switch (name) {
+		case "real" : "Double"
+		case "integer" : "Integer"
+		case "boolean" : "Boolean"
+		case "string" : "String"
+		case "void" : "Void"
+		case null : "Void"
+		default : ""
+		};
+		
+String getInitialValue(Type this) :
+		switch (name) {
+		case "real" : "0D"
+		case "integer" : "0"
+		case "boolean" : "false"
+		case "string" : "\"\""
+		case "void" : "null"
+		default : ""
+		};
+