Ver código fonte

Generate CPP Action added

Andreas Mülder 14 anos atrás
pai
commit
043319ef74

+ 12 - 1
plugins/org.yakindu.sct.generator.base/META-INF/MANIFEST.MF

@@ -6,6 +6,17 @@ Bundle-Version: 1.0.0.qualifier
 Bundle-Activator: org.yakindu.sct.generator.base.GeneratorActivator
 Bundle-Vendor: YAKINDU
 Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime
+ org.eclipse.core.runtime,
+ org.yakindu.sct.model.sgraph;bundle-version="1.0.0";visibility:=reexport,
+ org.yakindu.sct.model.sexec;bundle-version="1.0.0";visibility:=reexport,
+ com.google.inject;bundle-version="2.0.0",
+ org.eclipse.xpand;bundle-version="1.1.0",
+ org.eclipse.core.resources;bundle-version="3.7.100",
+ org.eclipse.xtend;bundle-version="1.1.0",
+ org.eclipse.emf;bundle-version="2.6.0",
+ org.eclipse.xtend.typesystem.emf;bundle-version="1.0.1",
+ org.yakindu.sct.model.stext;bundle-version="1.0.0"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
+Export-Package: org.yakindu.sct.generator.base,
+ org.yakindu.sct.generator.base.util

+ 104 - 0
plugins/org.yakindu.sct.generator.base/src/org/yakindu/sct/generator/base/util/GeneratorBaseUtil.java

@@ -0,0 +1,104 @@
+package org.yakindu.sct.generator.base.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.Resource.Factory;
+import org.eclipse.emf.ecore.resource.impl.ResourceFactoryRegistryImpl;
+import org.eclipse.xpand2.XpandExecutionContextImpl;
+import org.eclipse.xpand2.XpandFacade;
+import org.eclipse.xpand2.output.Outlet;
+import org.eclipse.xpand2.output.OutputImpl;
+import org.eclipse.xtend.expression.Variable;
+import org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel;
+import org.yakindu.sct.model.sexec.ExecutionFlow;
+import org.yakindu.sct.model.sexec.SexecPackage;
+import org.yakindu.sct.model.sexec.transformation.ModelSequencer;
+import org.yakindu.sct.model.sexec.transformation.SequencerModule;
+import org.yakindu.sct.model.sgraph.SGraphPackage;
+import org.yakindu.sct.model.sgraph.Statechart;
+import org.yakindu.sct.model.stext.stext.StextPackage;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class GeneratorBaseUtil {
+
+	/**
+	 * Loads a {@link Statechart} model via the registered resource for a given
+	 * {@link URI}
+	 */
+	public static Statechart loadStatechart(URI uri) throws IOException {
+		Factory factory = ResourceFactoryRegistryImpl.INSTANCE.getFactory(uri);
+		Resource resource = factory.createResource(uri);
+		resource.load(Collections.emptyMap());
+		Statechart statechart = (Statechart) resource.getContents().get(0);
+		Assert.isNotNull(statechart);
+		return statechart;
+
+	}
+
+	/**
+	 * Transforms the {@link Statechart} model to a {@link ExecutionFlow} model
+	 */
+	public static ExecutionFlow createExecutionFlowModel(Statechart statechart) {
+		Injector injector = Guice.createInjector(new SequencerModule());
+		ModelSequencer sequencer = injector.getInstance(ModelSequencer.class);
+		ExecutionFlow flow = sequencer.transform(statechart);
+		Assert.isNotNull(flow);
+		return flow;
+	}
+
+	/**
+	 * Invokes the Template engine to generate resources
+	 */
+	public static void generate(ExecutionFlow flow, String templatePath,
+			IProject project, String targetFolder) throws CoreException {
+
+		String absoluteTargetFolder = ResourcesPlugin.getWorkspace().getRoot()
+				.getLocation().toOSString()
+				+ File.separator
+				+ project.getFullPath().toOSString()
+				+ File.separator + targetFolder;
+
+		OutputImpl output = new OutputImpl();
+		Outlet outlet = new Outlet(absoluteTargetFolder);
+		outlet.setOverwrite(true);
+		output.addOutlet(outlet);
+
+		XpandExecutionContextImpl execCtx = new XpandExecutionContextImpl(
+				output, null, Collections.<String, Variable> emptyMap(), null,
+				null);
+		EmfRegistryMetaModel metamodel = new EmfRegistryMetaModel() {
+			@Override
+			protected EPackage[] allPackages() {
+				return new EPackage[] { SGraphPackage.eINSTANCE,
+						StextPackage.eINSTANCE, EcorePackage.eINSTANCE,
+						SexecPackage.eINSTANCE };
+			}
+		};
+		execCtx.registerMetaModel(metamodel);
+		// generate
+		XpandFacade facade = XpandFacade.create(execCtx);
+		facade.evaluate(templatePath, flow);
+		// refresh the project to get external updates:
+		project.refreshLocal(IResource.DEPTH_INFINITE,
+				new NullProgressMonitor());
+	}
+}

+ 4 - 4
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/ModelSequencer.xtend

@@ -85,13 +85,13 @@ class ModelSequencer {
 	}
 	
 	
-	
-	
-	def dispatch Expression _raised(EventSpec e) {
+	 
+
+	def dispatch Expression raised(EventSpec e) {
 	}
 
 
-	def dispatch Expression _raised(RegularEventSpec e) {
+	def dispatch Expression raised(RegularEventSpec e) {
 		val r = stextFactory.createElementReferenceExpression
 		r.value = e.event as Declaration
 		r

+ 23 - 18
test-plugins/org.yakindu.sct.generator.cpp.test/src/org/yakindu/sct/generator/cpp/test/generator/TestModule.java

@@ -1,18 +1,23 @@
-package org.yakindu.sct.generator.cpp.test.generator;
-
-import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
-import org.eclipse.xtext.naming.IQualifiedNameProvider;
-
-import com.google.inject.Binder;
-import com.google.inject.Module;
-
-public class TestModule implements Module {
-
-	public void configure(Binder binder) {
-
-		binder.bind(IQualifiedNameProvider.class).to(
-				DefaultDeclarativeQualifiedNameProvider.class);
-
-	}
-
-}
+package org.yakindu.sct.model.sexec.transformation;
+
+import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+
+import com.google.inject.Binder;
+import com.google.inject.Module;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class SequencerModule implements Module {
+
+	public void configure(Binder binder) {
+
+		binder.bind(IQualifiedNameProvider.class).to(
+				DefaultDeclarativeQualifiedNameProvider.class);
+
+	}
+
+}

+ 0 - 93
plugins/org.yakindu.sct.model.sexec/xtend-gen/org/yakindu/sct/model/sexec/transformation/ModelSequencer.java

@@ -1,93 +0,0 @@
-package org.yakindu.sct.model.sexec.transformation;
-
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.EcoreUtil2;
-import org.eclipse.xtext.naming.IQualifiedNameProvider;
-import org.eclipse.xtext.naming.QualifiedName;
-import org.eclipse.xtext.xbase.lib.BooleanExtensions;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
-import org.eclipse.xtext.xbase.lib.Functions.Function1;
-import org.eclipse.xtext.xbase.lib.IterableExtensions;
-import org.yakindu.sct.model.sexec.ExecutionFlow;
-import org.yakindu.sct.model.sexec.ExecutionState;
-import org.yakindu.sct.model.sexec.SexecFactory;
-import org.yakindu.sct.model.sgraph.State;
-import org.yakindu.sct.model.sgraph.Statechart;
-
-@SuppressWarnings("all")
-public class ModelSequencer {
-  
-  @Inject
-  private IQualifiedNameProvider qfnProvider;
-  
-  private final HashMap<ArrayList<?>,ExecutionFlow> _createCache_transform = new HashMap<ArrayList<?>,ExecutionFlow>();
-  
-  public ExecutionFlow transform(final Statechart statechart) {
-    final ArrayList<?>_cacheKey = CollectionLiterals.newArrayList(statechart);
-    ExecutionFlow result;
-    synchronized (_createCache_transform) {
-      if (_createCache_transform.containsKey(_cacheKey)) {
-        return _createCache_transform.get(_cacheKey);
-      }
-      ExecutionFlow _createExecutionFlow = SexecFactory.eINSTANCE.createExecutionFlow();
-      result = _createExecutionFlow;
-      _createCache_transform.put(_cacheKey, result);
-    }
-    {
-      List<EObject> _eAllContentsAsList = EcoreUtil2.eAllContentsAsList(statechart);
-      List<EObject> content = _eAllContentsAsList;
-      final Function1<EObject,Boolean> _function = new Function1<EObject,Boolean>() {
-          public Boolean apply(final EObject e) {
-            boolean _operator_and = false;
-            if (!(e instanceof org.yakindu.sct.model.sgraph.State)) {
-              _operator_and = false;
-            } else {
-              boolean _isSimple = ((State) e).isSimple();
-              _operator_and = BooleanExtensions.operator_and((e instanceof org.yakindu.sct.model.sgraph.State), _isSimple);
-            }
-            return ((Boolean)_operator_and);
-          }
-        };
-      Iterable<EObject> _filter = IterableExtensions.<EObject>filter(content, _function);
-      Iterable<EObject> leafStates = _filter;
-      final Function1<EObject,Boolean> _function_1 = new Function1<EObject,Boolean>() {
-          public Boolean apply(final EObject state) {
-            EList<ExecutionState> _states = result.getStates();
-            ExecutionState _transform = ModelSequencer.this.transform(((State) state));
-            boolean _add = _states.add(_transform);
-            return ((Boolean)_add);
-          }
-        };
-      IterableExtensions.<EObject>forEach(leafStates, _function_1);
-    }
-    return result;
-  }
-  
-  private final HashMap<ArrayList<?>,ExecutionState> _createCache_transform_1 = new HashMap<ArrayList<?>,ExecutionState>();
-  
-  public ExecutionState transform(final State state) {
-    final ArrayList<?>_cacheKey = CollectionLiterals.newArrayList(state);
-    ExecutionState result;
-    synchronized (_createCache_transform_1) {
-      if (_createCache_transform_1.containsKey(_cacheKey)) {
-        return _createCache_transform_1.get(_cacheKey);
-      }
-      ExecutionState _createExecutionState = SexecFactory.eINSTANCE.createExecutionState();
-      result = _createExecutionState;
-      _createCache_transform_1.put(_cacheKey, result);
-    }
-    {
-      String _name = state.getName();
-      result.setSimpleName(_name);
-      QualifiedName _fullyQualifiedName = this.qfnProvider.getFullyQualifiedName(state);
-      String _string = _fullyQualifiedName.toString();
-      result.setName(_string);
-    }
-    return result;
-  }
-}

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

@@ -15,6 +15,7 @@ Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.xtend.typesystem.emf;bundle-version="1.0.1",
  org.yakindu.sct.model.stext;bundle-version="1.0.0",
  org.yakindu.sct.model.sexec;bundle-version="1.0.0",
- org.yakindu.sct.generator.cpp;bundle-version="1.0.0"
+ org.yakindu.sct.generator.cpp;bundle-version="1.0.0",
+ org.yakindu.sct.generator.base;bundle-version="1.0.0"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy

+ 0 - 59
test-plugins/org.yakindu.sct.generator.cpp.test/src/org/yakindu/sct/generator/cpp/test/generator/AbstractGeneratorTest.java

@@ -1,30 +1,13 @@
 package org.yakindu.sct.generator.cpp.test.generator;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
-import java.util.Collections;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.xpand2.XpandExecutionContextImpl;
-import org.eclipse.xpand2.XpandFacade;
-import org.eclipse.xpand2.output.Outlet;
-import org.eclipse.xpand2.output.OutputImpl;
-import org.eclipse.xtend.expression.Variable;
-import org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel;
-import org.yakindu.sct.model.sexec.ExecutionFlow;
-import org.yakindu.sct.model.sexec.SexecPackage;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
-import org.yakindu.sct.model.stext.stext.StextPackage;
 
 /**
  * 
@@ -67,46 +50,4 @@ public class AbstractGeneratorTest {
 
 		return project;
 	}
-
-	/**
-	 * Executes the Template via the {@link XpandFacade}
-	 * 
-	 * @param statechart
-	 *            the Statechart model to generate code for
-	 */
-	protected void generate(ExecutionFlow flow, String templatePath,
-			IProject project) throws CoreException {
-
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IResource resource = root.getProject(project.getName());
-		String containerName = root.getLocation().toOSString() + File.separator
-				+ project.getName() + File.separator + "src-gen";
-
-		OutputImpl output = new OutputImpl();
-		Outlet outlet = new Outlet(containerName);
-		outlet.setOverwrite(true);
-		output.addOutlet(outlet);
-
-		XpandExecutionContextImpl execCtx = new XpandExecutionContextImpl(
-				output, null, Collections.<String, Variable> emptyMap(), null,
-				null);
-		EmfRegistryMetaModel metamodel = new EmfRegistryMetaModel() {
-			@Override
-			protected EPackage[] allPackages() {
-				return new EPackage[] { SGraphPackage.eINSTANCE,
-						StextPackage.eINSTANCE, EcorePackage.eINSTANCE, SexecPackage.eINSTANCE };
-			}
-		};
-		execCtx.registerMetaModel(metamodel);
-
-		// generate
-		XpandFacade facade = XpandFacade.create(execCtx);
-		facade.evaluate(templatePath, flow);
-
-		// refresh the project to get external updates:
-		resource.refreshLocal(IResource.DEPTH_INFINITE,
-				new NullProgressMonitor());
-		System.out.println("Written to " + containerName);
-	}
-
 }

+ 29 - 44
test-plugins/org.yakindu.sct.generator.cpp.test/src/org/yakindu/sct/generator/cpp/test/generator/CPPGeneratorTest.java

@@ -1,21 +1,20 @@
 package org.yakindu.sct.generator.cpp.test.generator;
 
+import static org.junit.Assert.assertTrue;
+
 import java.net.URL;
-import java.util.Collections;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.Resource.Factory;
-import org.eclipse.emf.ecore.resource.impl.ResourceFactoryRegistryImpl;
 import org.junit.Before;
 import org.junit.Test;
+import org.yakindu.sct.generator.base.util.GeneratorBaseUtil;
 import org.yakindu.sct.model.sexec.ExecutionFlow;
 import org.yakindu.sct.model.sexec.If;
 import org.yakindu.sct.model.sexec.transformation.ModelSequencer;
+import org.yakindu.sct.model.sexec.transformation.SequencerModule;
 import org.yakindu.sct.model.sgraph.SGraphFactory;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.Statement;
@@ -31,9 +30,6 @@ import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 
-import static org.junit.Assert.*;
-	
-
 /**
  * 
  * @author andreas muelder - Initial contribution and API
@@ -46,7 +42,7 @@ public class CPPGeneratorTest extends AbstractGeneratorTest {
 
 	@Before
 	public void setup() {
-		Injector injector = Guice.createInjector(new TestModule());
+		Injector injector = Guice.createInjector(new SequencerModule());
 		injector.injectMembers(this);
 	}
 
@@ -63,75 +59,63 @@ public class CPPGeneratorTest extends AbstractGeneratorTest {
 				target.getFullPath().toString(), true);
 
 		String templatePath = "org::yakindu::sct::generator::cpp::templates::Main::main";
-
-		Factory factory = ResourceFactoryRegistryImpl.INSTANCE.getFactory(uri);
-		Resource resource = factory.createResource(uri);
-		resource.load(Collections.emptyMap());
-
-		Statechart statechart = (Statechart) resource.getContents().get(0);
-		Assert.isNotNull(statechart);
-		ExecutionFlow flow = sequencer.transform(statechart);
-		Assert.isNotNull(flow);
-		generate(flow, templatePath, project);
-
+		Statechart statechart = GeneratorBaseUtil.loadStatechart(uri);
+		ExecutionFlow executionFlow = GeneratorBaseUtil
+				.createExecutionFlowModel(statechart);
+		GeneratorBaseUtil.generate(executionFlow, templatePath, project,
+				"src-gen");
 	}
-	
-	
+
 	@Test
 	public void testSingleRegularEventTriggerCondition() {
-		
+
 		EventDefinition e1 = _createEventDefinition("e1");
 
 		ReactionTrigger tr1 = StextFactory.eINSTANCE.createReactionTrigger();
 		tr1.getTriggers().add(_createRegularEventSpec(e1));
-		
+
 		Statement s = sequencer.buildCondition(tr1);
-		
+
 		assertTrue(s instanceof ElementReferenceExpression);
 	}
 
-
-
 	@Test
 	public void testMultipleRegularEventTriggerCondition() {
-		
+
 		EventDefinition e1 = _createEventDefinition("e1");
 		EventDefinition e2 = _createEventDefinition("e2");
-		
+
 		ReactionTrigger tr1 = StextFactory.eINSTANCE.createReactionTrigger();
 		tr1.getTriggers().add(_createRegularEventSpec(e1));
 		tr1.getTriggers().add(_createRegularEventSpec(e2));
-		
+
 		Statement s = sequencer.buildCondition(tr1);
-		
+
 		assertTrue(s instanceof LogicalOrExpression);
-		assertTrue( ((LogicalOrExpression)s).getLeftOperand() instanceof ElementReferenceExpression);
-		assertTrue( ((LogicalOrExpression)s).getRightOperand() instanceof ElementReferenceExpression);
+		assertTrue(((LogicalOrExpression) s).getLeftOperand() instanceof ElementReferenceExpression);
+		assertTrue(((LogicalOrExpression) s).getRightOperand() instanceof ElementReferenceExpression);
 	}
 
-
 	@Test
 	public void testTransitionSequence() {
-		
+
 		EventDefinition e1 = _createEventDefinition("e1");
 		EventDefinition e2 = _createEventDefinition("e2");
-		
-		
+
 		ReactionTrigger tr1 = StextFactory.eINSTANCE.createReactionTrigger();
 		tr1.getTriggers().add(_createRegularEventSpec(e1));
 		tr1.getTriggers().add(_createRegularEventSpec(e2));
-		
+
 		Transition t = SGraphFactory.eINSTANCE.createTransition();
 		t.setTrigger(tr1);
-		
+
 		If s = sequencer.buildTransitionSequence(t);
-		
+
 		assertTrue(s.getCondition() instanceof LogicalOrExpression);
-		assertTrue( ((LogicalOrExpression)s.getCondition()).getLeftOperand() instanceof ElementReferenceExpression);
-		assertTrue( ((LogicalOrExpression)s.getCondition()).getRightOperand() instanceof ElementReferenceExpression);
+		assertTrue(((LogicalOrExpression) s.getCondition()).getLeftOperand() instanceof ElementReferenceExpression);
+		assertTrue(((LogicalOrExpression) s.getCondition()).getRightOperand() instanceof ElementReferenceExpression);
 	}
 
-
 	protected EventDefinition _createEventDefinition(String name) {
 		EventDefinition e1 = StextFactory.eINSTANCE.createEventDefinition();
 		e1.setName(name);
@@ -139,7 +123,8 @@ public class CPPGeneratorTest extends AbstractGeneratorTest {
 	}
 
 	protected RegularEventSpec _createRegularEventSpec(EventDefinition e1) {
-		RegularEventSpec e1Spec = StextFactory.eINSTANCE.createRegularEventSpec();
+		RegularEventSpec e1Spec = StextFactory.eINSTANCE
+				.createRegularEventSpec();
 		e1Spec.setEvent(e1);
 		return e1Spec;
 	}