Browse Source

Restructuring of Code Generator to allow better overriding in
sub-generators

muelder 10 years ago
parent
commit
867e3952c5

+ 133 - 99
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/Statemachine.xtend

@@ -26,6 +26,8 @@ import org.yakindu.sct.model.stext.stext.EventDefinition
 import org.yakindu.sct.model.stext.stext.InterfaceScope
 import org.yakindu.sct.model.stext.stext.VariableDefinition
 
+import static org.eclipse.xtext.util.Strings.*
+
 class Statemachine {
 	
 	@Inject protected extension Naming
@@ -87,8 +89,8 @@ class Statemachine {
 	
 	def protected createImports(ExecutionFlow flow, GeneratorEntry entry) '''
 		«IF entry.createInterfaceObserver && flow.hasOutgoingEvents»
-		import java.util.LinkedList;
-		import java.util.List;
+			import java.util.LinkedList;
+			import java.util.List;
 		«ENDIF»
 		«IF flow.timed»
 			import «entry.getBasePackageName()».ITimer;
@@ -326,123 +328,155 @@ class Statemachine {
 		private final class «scope.getInterfaceImplName» implements «scope.getInterfaceName» {
 		
 		«IF entry.createInterfaceObserver && scope.hasOutgoingEvents»
-			private List<«scope.getInterfaceListenerName»> listeners = new LinkedList<«scope.getInterfaceListenerName»>();
-			
-			public List<«scope.getInterfaceListenerName»> getListeners() {
-				return listeners;
-			}
+			«scope.generateListeners»
 		«ENDIF»
 		
 		«IF scope.hasOperations»
-			private «scope.getInterfaceOperationCallbackName()» operationCallback;
-			
-			public void set«scope.getInterfaceOperationCallbackName»(
-					«scope.getInterfaceOperationCallbackName» operationCallback) {
-				this.operationCallback = operationCallback;
-			}
+			«scope.generateOperationCallback»
 		«ENDIF»
 		
-		«FOR event : scope.eventDefinitions»
-			
-			private boolean «event.symbol»;
-			
-			«IF event.type != null && !isSame(event.type, getType(GenericTypeSystem.VOID))»
-				private «event.type.targetLanguageName» «event.valueIdentifier»;
-			«ENDIF»
-			
-			«IF event.direction == Direction::IN»
-				«IF event.type != null && !isSame(event.type, getType(GenericTypeSystem.VOID))»
-					public void raise«event.name.asName»(«event.type.targetLanguageName» value) {
-						«event.symbol» = true;
-						«event.valueIdentifier» = value;
-					}
-					
-					private «event.type.targetLanguageName» get«event.name.asName»Value() {
-						«event.getIllegalAccessValidation()»
-						return «event.valueIdentifier»;
-					}
-					
-				«ELSE»
-					public void raise«event.name.asName»() {
-						«event.symbol» = true;
-					}
-					
-				«ENDIF»
-			«ENDIF»
-			
-			«IF event.direction == Direction::OUT»
-				
-				public boolean isRaised«event.name.asName»() {
-					return «event.symbol»;
-				}
-				
-				«IF event.type != null && !isSame(event.type, getType(GenericTypeSystem.VOID))»
-					private void raise«event.name.asName»(«event.type.targetLanguageName» value) {
-						«event.symbol» = true;
-						«event.valueIdentifier» = value;
-						«IF entry.createInterfaceObserver»
-						for («scope.interfaceListenerName» listener : listeners) {
-							listener.on«event.name.asEscapedName»Raised(value);
-						}
-						«ENDIF»
-					}
-					
-					public «event.type.targetLanguageName» get«event.name.asName»Value() {
-						«event.getIllegalAccessValidation()»
-						return «event.valueIdentifier»;
-					}
-				«ELSE»
-					private void raise«event.name.asName»() {
-						«event.symbol» = true;
-						«IF entry.createInterfaceObserver»
-							for («scope.interfaceListenerName» listener : listeners) {
-								listener.on«event.name.asEscapedName»Raised();
-							}
-						«ENDIF»
-					}
-				«ENDIF»
-			«ENDIF»
+		«FOR event : scope.eventDefinitions BEFORE newLine SEPARATOR newLine»
+			«generateEventDefinition(event, entry, scope)»
 		«ENDFOR»
 		
-		«FOR variable : scope.variableDefinitions»
-				
-				«IF !variable.const»
-					«variable.writeableFieldDeclaration»
-				«ENDIF»
-				public «variable.type.targetLanguageName» «variable.getter» {
-					return «variable.symbol»;
-				}
-				
-				«IF !variable.readonly && !variable.const»
-					public void «variable.setter»(«variable.type.targetLanguageName» value) {
-						this.«variable.symbol» = value;
-					}
-				«ENDIF»
+		«FOR variable : scope.variableDefinitions BEFORE newLine SEPARATOR newLine»
+			«generateVariableDefinition(variable)»
 		«ENDFOR»
 		
 		«IF scope.hasEvents»
-			public void clearEvents() {
-			«FOR event : scope.eventDefinitions»
-				«IF event.direction != Direction::OUT»
+			«scope.generateClearEvents»
+		«ENDIF»
+		
+		«IF scope.hasOutgoingEvents()»
+			«generateClearOutEvents(scope)»
+		«ENDIF»
+		}
+	'''
+	
+	protected def generateClearOutEvents(InterfaceScope scope) '''
+		public void clearOutEvents() {
+		«FOR event : scope.eventDefinitions»
+			«IF event.direction == Direction::OUT»
 				«event.symbol» = false;
-				«ENDIF»
-			«ENDFOR»
+			«ENDIF»
+		«ENDFOR»
+		}
+	'''
+	
+	
+	protected def generateClearEvents(InterfaceScope scope) '''
+		public void clearEvents() {
+		«FOR event : scope.eventDefinitions»
+			«IF event.direction != Direction::OUT»
+			«event.symbol» = false;
+			«ENDIF»
+		«ENDFOR»
+		}
+	'''
+	
+	protected def generateVariableDefinition(VariableDefinition variable) '''
+		«IF !variable.const»
+			«variable.writeableFieldDeclaration»
+		«ENDIF»
+		public «variable.type.targetLanguageName» «variable.getter» {
+			return «variable.symbol»;
+		}
+		
+		«IF !variable.readonly && !variable.const»
+			public void «variable.setter»(«variable.type.targetLanguageName» value) {
+				this.«variable.symbol» = value;
 			}
-			
+		«ENDIF»
+	'''
+	
+	protected def generateEventDefinition(EventDefinition event, GeneratorEntry entry, InterfaceScope scope) '''
+		private boolean «event.symbol»;
+		
+		«IF event.type != null && !isSame(event.type, getType(GenericTypeSystem.VOID))»
+			private «event.type.targetLanguageName» «event.valueIdentifier»;
 		«ENDIF»
 		
-		«IF scope.hasOutgoingEvents()»
-			public void clearOutEvents() {
-			«FOR event : scope.eventDefinitions»
-				«IF event.direction == Direction::OUT»
-					«event.symbol» = false;
+		«IF event.direction == Direction::IN»
+			«event.generateInEventDefinition»
+		«ENDIF»
+		
+		«IF event.direction == Direction::OUT»
+			«event.generateOutEventDefinition(entry, scope)»
+		«ENDIF»
+	'''
+			
+	protected def generateOutEventDefinition(EventDefinition event, GeneratorEntry entry, InterfaceScope scope) '''
+		
+		public boolean isRaised«event.name.asName»() {
+			return «event.symbol»;
+		}
+		
+		«IF event.type != null && !isSame(event.type, getType(GenericTypeSystem.VOID))»
+			private void raise«event.name.asName»(«event.type.targetLanguageName» value) {
+				«event.symbol» = true;
+				«event.valueIdentifier» = value;
+				«IF entry.createInterfaceObserver»
+				for («scope.interfaceListenerName» listener : listeners) {
+					listener.on«event.name.asEscapedName»Raised(value);
+				}
 				«ENDIF»
-			«ENDFOR»
 			}
+			
+			public «event.type.targetLanguageName» get«event.name.asName»Value() {
+				«event.getIllegalAccessValidation()»
+				return «event.valueIdentifier»;
+			}
+		«ELSE»
+			private void raise«event.name.asName»() {
+				«event.symbol» = true;
+				«IF entry.createInterfaceObserver»
+					for («scope.interfaceListenerName» listener : listeners) {
+						listener.on«event.name.asEscapedName»Raised();
+					}
+				«ENDIF»
+			}
+		«ENDIF»
+	'''
+
+	protected def generateInEventDefinition(EventDefinition event) '''
+		«IF event.type != null && !isSame(event.type, getType(GenericTypeSystem.VOID))»
+			public void raise«event.name.asName»(«event.type.targetLanguageName» value) {
+				«event.symbol» = true;
+				«event.valueIdentifier» = value;
+			}
+			
+			private «event.type.targetLanguageName» get«event.name.asName»Value() {
+				«event.getIllegalAccessValidation()»
+				return «event.valueIdentifier»;
+			}
+			
+		«ELSE»
+			public void raise«event.name.asName»() {
+				«event.symbol» = true;
+			}
+			
 		«ENDIF»
+	'''
+	
+	protected def generateOperationCallback(InterfaceScope scope) '''
+		private «scope.getInterfaceOperationCallbackName()» operationCallback;
+		
+		public void set«scope.getInterfaceOperationCallbackName»(
+				«scope.getInterfaceOperationCallbackName» operationCallback) {
+			this.operationCallback = operationCallback;
 		}
 	'''
 	
+	
+	protected def generateListeners(InterfaceScope scope) '''
+		private List<«scope.getInterfaceListenerName»> listeners = new LinkedList<«scope.getInterfaceListenerName»>();
+		
+		public List<«scope.getInterfaceListenerName»> getListeners() {
+			return listeners;
+		}
+	'''
+
+	
 	def protected getIllegalAccessValidation(EventDefinition it) '''
 		if (! «name.asEscapedIdentifier» ) 
 			throw new IllegalStateException("Illegal event value acces. Event «name.asEscapedName» is not raised!");