소스 검색

Merge pull request #467 from Yakindu/issue_456

Issue 456
Axel Terfloth 10 년 전
부모
커밋
66eaaa92d4

+ 9 - 8
plugins/org.yakindu.sct.domain.generic/src/org/yakindu/sct/domain/generic/extension/GenericDomainInjectorProvider.java

@@ -148,14 +148,15 @@ public class GenericDomainInjectorProvider implements IDomainInjectorProvider {
 	}
 
 	@Override
-	public Injector getGeneratorInjector(String generatorId, Module overrides) {
-		Module result = null;
-		if (overrides != null) {
-			result = Modules.override(getGeneratorModule(generatorId)).with(overrides);
-		} else
-			result = getGeneratorModule(generatorId);
-		result = Modules.override(getSequencerModule()).with(result);
-		return Guice.createInjector(result);
+	public Injector getGeneratorInjector(String generatorId, Module baseModule) {
+		Module genModule = getGeneratorModule(generatorId);
+
+		if (baseModule != null) {
+			genModule = Modules.override(baseModule).with(genModule);
+		} 
+		
+		genModule = Modules.override(getSequencerModule()).with(genModule);
+		return Guice.createInjector(genModule);
 	}
 
 }

+ 4 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CCodeGenerator.java

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012, 2015 Committers of YAKINDU and others.
+ * Copyright (c) 2012-2016 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
@@ -34,10 +34,13 @@ import com.google.inject.util.Modules;
  * 
  * @author Andreas Mülder
  * @author Alexander Nyßen
+ * @author axel terfloth
  * 
  */
 public class CCodeGenerator extends GenericJavaBasedGenerator {
 
+	public static String GENERATOR_ID = "yakindu::c";
+	
 	@Inject
 	private CGenerator delegate;
 	

+ 10 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/ConstantInitializationResolver.xtend

@@ -12,6 +12,8 @@ package org.yakindu.sct.generator.c
 
 import org.yakindu.base.expressions.expressions.Expression
 import org.yakindu.sct.model.stext.stext.VariableDefinition
+import org.yakindu.base.expressions.expressions.FeatureCall
+import org.yakindu.base.expressions.expressions.ElementReferenceExpression
 
 class ConstantInitializationResolver extends ExpressionCode {
 	
@@ -23,4 +25,12 @@ class ConstantInitializationResolver extends ExpressionCode {
 		target.initialValue.code
 	}
 		
+	override dispatch CharSequence code(FeatureCall it, VariableDefinition target) {
+		target.initialValue.code
+	}
+		
+	override dispatch CharSequence code(ElementReferenceExpression it, VariableDefinition target) {
+		target.initialValue.code
+	}
+		
 }

+ 15 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/ExpressionCode.xtend

@@ -49,6 +49,7 @@ import org.yakindu.sct.model.stext.stext.EventRaisingExpression
 import org.yakindu.sct.model.stext.stext.EventValueReferenceExpression
 import org.yakindu.sct.model.stext.stext.OperationDefinition
 import org.yakindu.sct.model.stext.stext.VariableDefinition
+import org.yakindu.base.types.Operation
 
 class ExpressionCode {
 
@@ -72,12 +73,26 @@ class ExpressionCode {
 
 	def dispatch CharSequence code(Expression it, VariableDefinition target) '''«target.access»'''
 
+	def dispatch CharSequence code(ElementReferenceExpression it, VariableDefinition target) '''«target.access»'''
+
+	def dispatch CharSequence code(FeatureCall it, VariableDefinition target) '''«target.access»'''
+
 	def dispatch CharSequence code(ElementReferenceExpression it, OperationDefinition target) '''«target.access»(«scHandle»«FOR arg : args BEFORE ', ' SEPARATOR ', '»«arg.
 		code»«ENDFOR»)'''
 
+	def dispatch CharSequence code(ElementReferenceExpression it, Operation target) '''«target.access»(«FOR arg : args SEPARATOR ', '»«arg.
+		code»«ENDFOR»)'''
+
+	def dispatch CharSequence code(ElementReferenceExpression it, org.yakindu.base.types.Property target) '''«target.access»'''
+
 	def dispatch CharSequence code(FeatureCall it, OperationDefinition target) '''«target.access»(«scHandle»«FOR arg : args BEFORE ', ' SEPARATOR ', '»«arg.
 		code»«ENDFOR»)'''
 
+	def dispatch CharSequence code(FeatureCall it, Operation target) '''«it.owner.code».«target.access»(«FOR arg : args SEPARATOR ', '»«arg.
+		code»«ENDFOR»)'''
+
+	def dispatch CharSequence code(FeatureCall it, org.yakindu.base.types.Property target) '''«it.owner.code».«target.access»'''
+
 	/* HANDLING LITERALS */
 	def dispatch CharSequence code(Literal it) '''#error unknown literal type «getClass().name» '''
 	

+ 8 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Naming.xtend

@@ -242,6 +242,14 @@ class Naming {
 		if (isConst) '''«it.constantName»''' else '''«scHandle»->«scope.instance».«name.asEscapedIdentifier»'''
 	}
 
+	def dispatch access(org.yakindu.base.types.Property it) {
+		'''«name.asEscapedIdentifier»'''
+	}
+
+	def dispatch access(org.yakindu.base.types.Operation it) {
+		'''«name.asEscapedIdentifier»'''
+	}
+
 	def dispatch access(OperationDefinition it) '''«asFunction»'''
 
 	def dispatch access(Event it) '''«scHandle»->«scope.instance».«name.asIdentifier.raised»'''

+ 7 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineHeader.xtend

@@ -37,6 +37,7 @@ class StatemachineHeader {
 	@Inject extension GenmodelEntries
 	@Inject extension INamingService
 
+	
 	def generateStatemachineHeader(ExecutionFlow flow, Statechart sc, IFileSystemAccess fsa, GeneratorEntry entry) {
 		flow.initializeNamingService
 		fsa.generateFile(flow.module.h, flow.generateStatemachineHeaderContents(entry))
@@ -48,8 +49,8 @@ class StatemachineHeader {
 		#ifndef «module.define»_H_
 		#define «module.define»_H_
 		
-		#include "«typesModule.h»"
-		
+		«includes»
+				
 		#ifdef __cplusplus
 		extern "C" { 
 		#endif 
@@ -109,6 +110,10 @@ class StatemachineHeader {
 		#endif /* «module.define»_H_ */
 	'''
 
+	def includes(ExecutionFlow it) '''
+		#include "«typesModule.h»"
+	'''
+	
 	def statesEnumDecl(ExecutionFlow it) '''
 		/*! Enumeration of all states */ 
 		typedef enum

+ 14 - 0
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/GeneratorExecutor.java

@@ -18,7 +18,11 @@ import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.yakindu.base.types.typesystem.AbstractTypeSystem;
+import org.yakindu.base.types.typesystem.ITypeSystem;
 import org.yakindu.sct.domain.extension.DomainRegistry;
 import org.yakindu.sct.domain.extension.IDomainDescriptor;
 import org.yakindu.sct.generator.core.extensions.GeneratorExtensions;
@@ -44,6 +48,7 @@ public class GeneratorExecutor {
 			return;
 		final GeneratorModel model = (GeneratorModel) resource.getContents().get(0);
 
+
 		Job generatorJob = new Job("Execute SCT Genmodel " + file.getName()) {
 			@Override
 			protected IStatus run(IProgressMonitor monitor) {
@@ -81,6 +86,15 @@ public class GeneratorExecutor {
 		Injector injector = domainDescriptor.getDomainInjectorProvider().getGeneratorInjector(model.getGeneratorId(),
 				overridesModule);
 		injector.injectMembers(generator);
+		
+		// TODO: refactor location for adding type system resource.
+		ITypeSystem typeSystem = injector.getInstance(ITypeSystem.class);
+		if (typeSystem instanceof AbstractTypeSystem) {
+			ResourceSet set = entry.getElementRef().eResource().getResourceSet();
+			set.getResources().add(((AbstractTypeSystem) typeSystem).getResource());
+			EcoreUtil.resolveAll(set);
+		}
+
 		return generator;
 	}