Преглед изворни кода

Refactoring of java expression bracketing.

markus.muehlbrandt@gmail.com пре 13 година
родитељ
комит
4049ce4436

+ 1 - 9
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/CoreStatemachine.xpt

@@ -122,15 +122,7 @@ getTimerService().resetTimer(
 
 «DEFINE ActionCode FOR Execution-»
 	«getComment()-»
-	«IF AssignmentExpression.isInstance(statement)-»
-		«LET statement.toCode() AS statement-»
-		«statement.subString(1,statement.length-1)»;
-		«ENDLET-»
-	«REM»«ELSEIF  ElementReferenceExpression.isInstance(statement)-»
-		«ENDREM»
-	«ELSE-»
-		«statement.toCode()»;
-	«ENDIF-»
+	«statement.toCode()»;
 «ENDDEFINE»
 
 «DEFINE ActionCode FOR Call-»

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

@@ -64,17 +64,17 @@ String getVariableIdentifier(AssignmentExpression this) :
 /* Assignment */
 String toCode(AssignmentExpression this) :
 	switch (operator) {
-		case AssignmentOperator::assign :"(" + getVariableIdentifier() + " = " + expression.toCode() + ")"
-		case AssignmentOperator::multAssign : "(" + getVariableIdentifier() + " *= " + expression.toCode() + ")"
-		case AssignmentOperator::divAssign : "(" + getVariableIdentifier() + " /= " + expression.toCode() + ")"
-		case AssignmentOperator::modAssign : "(" + getVariableIdentifier() + " %= " + expression.toCode() + ")"
-		case AssignmentOperator::addAssign : "(" + getVariableIdentifier() + " += " + expression.toCode() + ")"
-		case AssignmentOperator::subAssign : "(" + getVariableIdentifier() + " -= " + expression.toCode() + ")"
-		case AssignmentOperator::andAssign : "(" + getVariableIdentifier() + " &= " + expression.toCode() + ")"
-		case AssignmentOperator::xorAssign : "(" + getVariableIdentifier() + " ^= " + expression.toCode() + ")"
-		case AssignmentOperator::orAssign : "(" + getVariableIdentifier() + " != " + expression.toCode() + ")"
-		case AssignmentOperator::leftShiftAssign : "(" + getVariableIdentifier() + " <<= "+ expression.toCode() + ")"
-		case AssignmentOperator::rightShiftAssign : "(" + getVariableIdentifier() + " >>= " + expression.toCode() + ")"
+		case AssignmentOperator::assign : getVariableIdentifier() + " = " + expression.toCode()
+		case AssignmentOperator::multAssign : getVariableIdentifier() + " *= " + expression.toCode()
+		case AssignmentOperator::divAssign : getVariableIdentifier() + " /= " + expression.toCode()
+		case AssignmentOperator::modAssign : getVariableIdentifier() + " %= " + expression.toCode()
+		case AssignmentOperator::addAssign : getVariableIdentifier() + " += " + expression.toCode()
+		case AssignmentOperator::subAssign : getVariableIdentifier() + " -= " + expression.toCode()
+		case AssignmentOperator::andAssign : getVariableIdentifier() + " &= " + expression.toCode()
+		case AssignmentOperator::xorAssign : getVariableIdentifier() + " ^= " + expression.toCode()
+		case AssignmentOperator::orAssign : getVariableIdentifier() + " != " + expression.toCode()
+		case AssignmentOperator::leftShiftAssign : getVariableIdentifier() + " <<= "+ expression.toCode()
+		case AssignmentOperator::rightShiftAssign : getVariableIdentifier() + " >>= " + expression.toCode()
 		default : ""
 };
 		
@@ -99,10 +99,10 @@ String toCode(EventValueReferenceExpression expression):
 
 /* Logical Expressions */
 String toCode(LogicalOrExpression expression) :
-  	"(" + expression.leftOperand.toCode() + " || " + expression.rightOperand.toCode() + ")";
+  	expression.leftOperand.toCode() + " || " + expression.rightOperand.toCode();
   	
 String toCode(LogicalAndExpression expression) :
-  	"("+expression.leftOperand.toCode() + " && " + expression.rightOperand.toCode() + ")";
+  	expression.leftOperand.toCode() + " && " + expression.rightOperand.toCode();
 
 String toCode(LogicalNotExpression expression) :
   	" !" + expression.operand.toCode();
@@ -111,27 +111,27 @@ String toCode(LogicalRelationExpression expression) :
 	if (expression.leftOperand.inferType().isString()) then
 		expression.logicalString()
 	else
-		"("+expression.leftOperand.toCode() + getOperator(expression.operator) + expression.rightOperand.toCode()+")";
+		expression.leftOperand.toCode() + getOperator(expression.operator) + expression.rightOperand.toCode();
 
 String logicalString(LogicalRelationExpression expression) : 
 if(expression.operator == RelationalOperator::equals) then
-	"("+expression.leftOperand.toCode()+"==null?"+expression.rightOperand.toCode()+"==null:"+expression.leftOperand.toCode()+".equals("+expression.rightOperand.toCode()+"))"
+	expression.leftOperand.toCode() + "== null?" + expression.rightOperand.toCode() + " ==null :" + expression.leftOperand.toCode()+".equals("+expression.rightOperand.toCode()+")"
 else if(expression.operator == RelationalOperator::notEquals) then
-	"("+expression.leftOperand.toCode()+"==null?"+expression.rightOperand.toCode()+"==null:!"+expression.leftOperand.toCode()+".equals("+expression.rightOperand.toCode()+"))"
+	expression.leftOperand.toCode() + "== null?" + expression.rightOperand.toCode() + " ==null : !" + expression.leftOperand.toCode()+".equals("+expression.rightOperand.toCode()+")"
 ;
 
 
 String toCode(BitwiseAndExpression expression) :
-  	"("+expression.leftOperand.toCode() + " & " + expression.rightOperand.toCode()+")";
+  	expression.leftOperand.toCode() + " & " + expression.rightOperand.toCode();
 
 String toCode(BitwiseOrExpression expression) :
-  	"("+expression.leftOperand.toCode() + " | " + expression.rightOperand.toCode()+")";
+  	expression.leftOperand.toCode() + " | " + expression.rightOperand.toCode();
 
 String toCode(BitwiseXorExpression expression) :
-  	"("+expression.leftOperand.toCode() + " ^ " + expression.rightOperand.toCode()+")";
+  	expression.leftOperand.toCode() + " ^ " + expression.rightOperand.toCode();
 
 String toCode(ShiftExpression expression) :
-  	"("+expression.leftOperand.toCode() + getOperator(expression.operator) + expression.rightOperand.toCode()+")";
+  	expression.leftOperand.toCode() + getOperator(expression.operator) + expression.rightOperand.toCode();
   	
 
 String toCode(NumericalAddSubtractExpression expression) :
@@ -141,7 +141,7 @@ String toCode(NumericalMultiplyDivideExpression expression) :
   	expression.leftOperand.toCode() + getOperator(expression.operator) + expression.rightOperand.toCode();
 
 String toCode(NumericalUnaryExpression expression) :
-    getOperator(expression.operator) + " ( " + expression.operand.toCode() + " ) ";
+    getOperator(expression.operator) + expression.operand.toCode();
 
 String toCode(TimeEvent exp) :
 	"timeEvents["+getEventIdentifier(exp)+".getIndex()]";

+ 22 - 3
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/RuntimeService.xpt

@@ -34,7 +34,7 @@ public class RuntimeService {
 
 	private static RuntimeService runtimeService;
 
-	private Timer timer = new Timer();
+	private Timer timer = null;
 
 	private Map<Long, StatemachineTimerTask> timerTasks = new HashMap<Long, StatemachineTimerTask>();
 
@@ -128,6 +128,11 @@ public class RuntimeService {
 			StatemachineTimerTask timerTask = new StatemachineTimerTask();
 			timerTasks.put(cyclePeriod, timerTask);
 			boolean ret = timerTask.addStatemachine(statemachine);
+			// Create a new Timer instance if runtime service was cancelled
+			// before
+			if (timer == null) {
+				timer = new Timer();
+			}
 			timer.scheduleAtFixedRate(timerTask, 0, cyclePeriod);
 			return ret;
 		}
@@ -156,12 +161,12 @@ public class RuntimeService {
 	/**
 	 * Cancels the execution of statemachines for the given cycle period. This
 	 * stops the execution of statemachines which are registered for the given
-	 * cycle period and cancels the executing timer task.
+	 * cycle period and cancels the executing {@link TimerTask}.
 	 * 
 	 * @return {@code true} if poperly cancelled
 	 */
 	public boolean cancelAll(long cyclePeriod) {
-		if (timerTasks.containsKey(cyclePeriod)) {
+		if (timer != null && timerTasks.containsKey(cyclePeriod)) {
 			TimerTask task = timerTasks.get(cyclePeriod);
 			task.cancel();
 			timer.purge();
@@ -202,6 +207,20 @@ public class RuntimeService {
 		}
 		return false;
 	}
+
+	/**
+	 * Cancels the execution of all registered statemachines. This cancels the
+	 * executing {@link Timer} freeing all allocated resources and terminates
+	 * all existing execution threads.
+	 */
+	public void cancelTimer() {
+		if (timer != null) {
+			timer.cancel();
+			timer.purge();
+			timerTasks.clear();
+			timer = null;
+		}
+	}
 }
 «ENDFILE-»
 «ENDDEFINE»

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

@@ -94,7 +94,7 @@ public interface 
 			«ENDIF-»
 			«ENDFOREACH-»
 		}
-		«ENDIF-»
+	«ENDIF-»
 	«IF interface.hasOperations()-»
 		public interface «interface.getInterfaceOperationCallbackName()» {
 		«FOREACH interface.getOperations() AS operation»