Pārlūkot izejas kodu

Added IncludeProvider to the CCodeGeneratorModule to be able to emit event driven code for c statecharts.

Robert Rudi 8 gadi atpakaļ
vecāks
revīzija
7c4095e7f9

+ 1 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CCodeGeneratorModule.java

@@ -46,6 +46,7 @@ public class CCodeGeneratorModule implements IGeneratorModule {
 		binder.bind(IExecutionFlowGenerator.class).to(CGenerator.class);
 		binder.bind(INamingService.class).to(CNamingService.class);
 		binder.bind(ICodegenTypeSystemAccess.class).to(CTypeSystemAccess.class);
+		binder.bind(IncludeProvider.class).to(StandardIncludeProvider.class);
 		bindIGenArtifactConfigurations(entry, binder);
 		bindTracingProperty(entry, binder);
 		configureEventDriven(entry, binder);

+ 9 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/IncludeProvider.java

@@ -0,0 +1,9 @@
+package org.yakindu.sct.generator.c;
+
+import java.util.List;
+
+import org.yakindu.sct.model.sexec.ExecutionFlow;
+
+public interface IncludeProvider {
+	public List<CharSequence> getIncludes(ExecutionFlow it, List<CharSequence> includes, IGenArtifactConfigurations artifactConfigs);
+}

+ 16 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StandardIncludeProvider.xtend

@@ -0,0 +1,16 @@
+package org.yakindu.sct.generator.c
+
+import com.google.inject.Inject
+import java.util.List
+import org.yakindu.sct.generator.c.extensions.Naming
+import org.yakindu.sct.model.sexec.ExecutionFlow
+
+class StandardIncludeProvider implements IncludeProvider {
+	@Inject protected extension Naming cNaming
+	
+	override getIncludes(ExecutionFlow it, List<CharSequence> includes, extension IGenArtifactConfigurations artifactConfigs) {
+		includes += '''#include "«(typesModule.h).relativeTo(module.h)»"'''
+		includes
+	}
+	
+}

+ 8 - 4
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineHeader.xtend

@@ -33,7 +33,7 @@ import org.yakindu.sct.model.stext.stext.VariableDefinition
 import static org.eclipse.xtext.util.Strings.*
 
 class StatemachineHeader implements IContentTemplate {
-
+	@Inject protected extension IncludeProvider
 	@Inject protected extension Naming cNaming
 	@Inject protected extension Navigation
 	@Inject protected extension ICodegenTypeSystemAccess
@@ -143,9 +143,13 @@ class StatemachineHeader implements IContentTemplate {
 		includes(it, defaultConfigs)
 	}
 
-	def includes(ExecutionFlow it, extension IGenArtifactConfigurations artifactConfigs) '''
-		#include "«(typesModule.h).relativeTo(module.h)»"
-	'''
+	def final includes(ExecutionFlow it, extension IGenArtifactConfigurations artifactConfigs) {
+		'''
+		«FOR i : getIncludes(newArrayList, artifactConfigs)»
+		  «i»
+		«ENDFOR»
+		'''
+	}
 	
 	def statesEnumDecl(ExecutionFlow it) '''
 		/*! Enumeration of all states */ 

+ 2 - 1
plugins/org.yakindu.sct.generator.cpp/META-INF/MANIFEST.MF

@@ -10,5 +10,6 @@ Require-Bundle: org.yakindu.sct.model.sexec,
  org.yakindu.sct.generator.c,
  org.yakindu.sct.model.stext.lib
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Export-Package: org.yakindu.sct.generator.cpp
+Export-Package: org.yakindu.sct.generator.cpp,
+ org.yakindu.sct.generator.cpp.eventdriven
 Bundle-Vendor: statecharts.org

+ 4 - 0
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppCodeGeneratorModule.java

@@ -18,12 +18,14 @@ import org.yakindu.base.types.Annotation;
 import org.yakindu.base.types.inferrer.ITypeSystemInferrer;
 import org.yakindu.sct.generator.c.DefaultGenArtifactConfigurations;
 import org.yakindu.sct.generator.c.IGenArtifactConfigurations;
+import org.yakindu.sct.generator.c.IncludeProvider;
 import org.yakindu.sct.generator.c.SimpleGenArtifactConfigurations;
 import org.yakindu.sct.generator.c.extensions.Naming;
 import org.yakindu.sct.generator.c.types.CTypeSystemAccess;
 import org.yakindu.sct.generator.core.IExecutionFlowGenerator;
 import org.yakindu.sct.generator.core.IGeneratorModule;
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess;
+import org.yakindu.sct.generator.cpp.eventdriven.EventDrivenCppIncludeProvider;
 import org.yakindu.sct.generator.cpp.eventdriven.EventDrivenEventCode;
 import org.yakindu.sct.generator.cpp.eventdriven.EventDrivenExpressionCode;
 import org.yakindu.sct.generator.cpp.eventdriven.EventDrivenStatemachineHeader;
@@ -51,6 +53,7 @@ public class CppCodeGeneratorModule implements IGeneratorModule {
 		binder.bind(INamingService.class).to(CppNamingService.class);
 		binder.bind(ITypeSystemInferrer.class).to(STextTypeInferrer.class);
 		binder.bind(Naming.class).to(CppNaming.class);
+		binder.bind(IncludeProvider.class).to(StandardCppIncludeProvider.class);
 		bindEventDrivenClasses(entry, binder);
 		bindIGenArtifactConfigurations(entry, binder);
 	}
@@ -75,6 +78,7 @@ public class CppCodeGeneratorModule implements IGeneratorModule {
 			binder.bind(StatemachineImplementation.class).to(EventDrivenStatemachineImplementation.class);
 			binder.bind(CppExpressionsGenerator.class).to(EventDrivenExpressionCode.class);
 			binder.bind(EventCode.class).to(EventDrivenEventCode.class);
+			binder.bind(StandardCppIncludeProvider.class).to(EventDrivenCppIncludeProvider.class);
 		}
 	}
 

+ 25 - 0
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StandardCppIncludeProvider.xtend

@@ -0,0 +1,25 @@
+package org.yakindu.sct.generator.cpp
+
+import com.google.inject.Inject
+import java.util.List
+import org.yakindu.sct.generator.c.IGenArtifactConfigurations
+import org.yakindu.sct.generator.c.IncludeProvider
+import org.yakindu.sct.generator.c.StandardIncludeProvider
+import org.yakindu.sct.model.sexec.ExecutionFlow
+
+class StandardCppIncludeProvider extends StandardIncludeProvider implements IncludeProvider {
+
+	@Inject protected extension CppNaming
+	@Inject protected extension Navigation
+
+	override getIncludes(ExecutionFlow it, List<CharSequence> includes,
+		extension IGenArtifactConfigurations artifactConfigs) {
+		super.getIncludes(it, includes, artifactConfigs)
+		includes += '''#include "«(statemachineInterface.h).relativeTo(module.h)»"'''
+		if (timed)
+			includes += '''#include "«(timedStatemachineInterface.h).relativeTo(module.h)»"'''
+		includes
+
+	}
+
+}

+ 0 - 8
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineHeader.xtend

@@ -148,14 +148,6 @@ class StatemachineHeader extends org.yakindu.sct.generator.c.StatemachineHeader
 		''''''
 	}
 
-	override includes(ExecutionFlow it, extension IGenArtifactConfigurations artifactConfigs) '''
-		#include "«(typesModule.h).relativeTo(module.h)»"
-		#include "«(statemachineInterface.h).relativeTo(module.h)»"
-		«IF timed»
-			#include "«(timedStatemachineInterface.h).relativeTo(module.h)»"
-		«ENDIF»
-	'''
-
 	def protected getInterfaceExtensions(ExecutionFlow flow) {
 
 		var String interfaces = "";

+ 23 - 0
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/eventdriven/EventDrivenCppIncludeProvider.xtend

@@ -0,0 +1,23 @@
+package org.yakindu.sct.generator.cpp.eventdriven
+
+import com.google.inject.Inject
+import org.yakindu.sct.generator.c.IncludeProvider
+import org.yakindu.sct.generator.cpp.StandardCppIncludeProvider
+import org.yakindu.sct.model.sexec.ExecutionFlow
+import java.util.List
+import org.yakindu.sct.generator.c.IGenArtifactConfigurations
+
+/**
+ * @author robert rudi
+ * Combines the standard includes for C++ with the includes for the C++ event driven case.
+ */
+class EventDrivenCppIncludeProvider extends StandardCppIncludeProvider implements IncludeProvider {
+	@Inject protected EventDrivenCppIncludeProviderModule eventDrivenIncludes
+	
+	override getIncludes(ExecutionFlow it, List<CharSequence> includes, extension IGenArtifactConfigurations artifactConfigs) {
+		super.getIncludes(it, includes, artifactConfigs)
+		eventDrivenIncludes.getIncludes(it, includes, artifactConfigs)
+		includes
+	}
+	
+}

+ 15 - 0
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/eventdriven/EventDrivenCppIncludeProviderModule.xtend

@@ -0,0 +1,15 @@
+package org.yakindu.sct.generator.cpp.eventdriven
+
+import java.util.List
+import org.yakindu.sct.generator.c.IGenArtifactConfigurations
+import org.yakindu.sct.generator.c.IncludeProvider
+import org.yakindu.sct.model.sexec.ExecutionFlow
+
+final class EventDrivenCppIncludeProviderModule implements IncludeProvider {
+
+	override getIncludes(ExecutionFlow it, List<CharSequence> includes, extension IGenArtifactConfigurations artifactConfigs) {
+		includes += "#include <deque>"
+		includes
+	}
+	
+}

+ 0 - 7
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/eventdriven/EventDrivenStatemachineHeader.xtend

@@ -52,13 +52,6 @@ class EventDrivenStatemachineHeader extends StatemachineHeader {
 		'''
 	}
 	
-	override includes(ExecutionFlow it, extension IGenArtifactConfigurations artifactConfigs) {
-		'''
-		#include <deque>
-		«super.includes(it, artifactConfigs)»
-		'''
-	}
-	
 	override CharSequence protectedInnerClassMembers(StatechartScope scope) {
 		'''
 		«super.protectedInnerClassMembers(scope)»