From 8ea97ec14abfcb90c3a38876b51d036ea6a43108 Mon Sep 17 00:00:00 2001 From: Sven Efftinge Date: Thu, 4 Aug 2011 16:09:57 +0200 Subject: first bits for the generator --- .../xcore/tests/util/AbstractModelSanityTest.java | 2 +- org.eclipse.emf.ecore.xcore.ui/plugin.xml | 9 +++ org.eclipse.emf.ecore.xcore.ui/plugin.xml_gen | 7 ++ .../emf/ecore/xcore/ui/AbstractXcoreUiModule.java | 10 +++ org.eclipse.emf.ecore.xcore/META-INF/MANIFEST.MF | 4 +- .../ecore/xcore/AbstractXcoreRuntimeModule.java | 5 ++ .../org/eclipse/emf/ecore/xcore/GenerateXcore.mwe2 | 5 ++ .../emf/ecore/xcore/generator/XcoreGenerator.xtend | 53 +++++++++++++++ .../emf/ecore/xcore/util/MappingFacade.xtend | 27 ++++++++ .../emf/ecore/xcore/generator/XcoreGenerator.java | 79 ++++++++++++++++++++++ .../emf/ecore/xcore/util/MappingFacade.java | 31 +++++++++ 11 files changed, 230 insertions(+), 2 deletions(-) create mode 100644 org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/generator/XcoreGenerator.xtend create mode 100644 org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/util/MappingFacade.xtend create mode 100644 org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/generator/XcoreGenerator.java create mode 100644 org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/util/MappingFacade.java diff --git a/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/util/AbstractModelSanityTest.java b/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/util/AbstractModelSanityTest.java index b3c10c279..26955f9d2 100644 --- a/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/util/AbstractModelSanityTest.java +++ b/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/util/AbstractModelSanityTest.java @@ -10,7 +10,7 @@ import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.mwe.utils.StandaloneSetup; import org.eclipse.xtext.diagnostics.ExceptionDiagnostic; -import org.eclipse.xtext.junit.serializer.SerializerTester; +import org.eclipse.xtext.junit4.serializer.SerializerTester; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.util.CancelIndicator; diff --git a/org.eclipse.emf.ecore.xcore.ui/plugin.xml b/org.eclipse.emf.ecore.xcore.ui/plugin.xml index 1de9b5e03..7d6bf0c85 100755 --- a/org.eclipse.emf.ecore.xcore.ui/plugin.xml +++ b/org.eclipse.emf.ecore.xcore.ui/plugin.xml @@ -199,6 +199,15 @@ + + + + + + <-- MANUAL ADDITIONS --> + + + + + + diff --git a/org.eclipse.emf.ecore.xcore.ui/src-gen/org/eclipse/emf/ecore/xcore/ui/AbstractXcoreUiModule.java b/org.eclipse.emf.ecore.xcore.ui/src-gen/org/eclipse/emf/ecore/xcore/ui/AbstractXcoreUiModule.java index 28ecdd61b..ee918edc6 100644 --- a/org.eclipse.emf.ecore.xcore.ui/src-gen/org/eclipse/emf/ecore/xcore/ui/AbstractXcoreUiModule.java +++ b/org.eclipse.emf.ecore.xcore.ui/src-gen/org/eclipse/emf/ecore/xcore/ui/AbstractXcoreUiModule.java @@ -113,6 +113,16 @@ public abstract class AbstractXcoreUiModule extends DefaultUiModule { return org.eclipse.emf.ecore.xcore.ui.quickfix.XcoreQuickfixProvider.class; } + // contributed by org.eclipse.xtext.generator.generator.GeneratorFragment + public Class bindIXtextBuilderParticipant() { + return org.eclipse.xtext.builder.JavaProjectBasedBuilderParticipant.class; + } + + // contributed by org.eclipse.xtext.generator.generator.GeneratorFragment + public org.eclipse.core.resources.IWorkspaceRoot bindIWorkspaceRootToInstance() { + return org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot(); + } + // contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment public java.lang.ClassLoader bindClassLoaderToInstance() { return getClass().getClassLoader(); diff --git a/org.eclipse.emf.ecore.xcore/META-INF/MANIFEST.MF b/org.eclipse.emf.ecore.xcore/META-INF/MANIFEST.MF index 3844c81b1..4945819ec 100644 --- a/org.eclipse.emf.ecore.xcore/META-INF/MANIFEST.MF +++ b/org.eclipse.emf.ecore.xcore/META-INF/MANIFEST.MF @@ -19,7 +19,9 @@ Require-Bundle: org.eclipse.xtext;bundle-version="2.0.0";visibility:=reexport, org.eclipse.xtext.common.types, org.eclipse.xtext.xtend2.lib Import-Package: org.apache.log4j, - org.apache.commons.logging + org.apache.commons.logging, + org.eclipse.xtext.xbase.lib, + org.eclipse.xtext.xtend2.lib Bundle-RequiredExecutionEnvironment: J2SE-1.5 Export-Package: org.eclipse.emf.ecore.xcore, org.eclipse.emf.ecore.xcore.formatting, diff --git a/org.eclipse.emf.ecore.xcore/src-gen/org/eclipse/emf/ecore/xcore/AbstractXcoreRuntimeModule.java b/org.eclipse.emf.ecore.xcore/src-gen/org/eclipse/emf/ecore/xcore/AbstractXcoreRuntimeModule.java index b46cf2c4b..8c6e46e6e 100644 --- a/org.eclipse.emf.ecore.xcore/src-gen/org/eclipse/emf/ecore/xcore/AbstractXcoreRuntimeModule.java +++ b/org.eclipse.emf.ecore.xcore/src-gen/org/eclipse/emf/ecore/xcore/AbstractXcoreRuntimeModule.java @@ -124,6 +124,11 @@ public abstract class AbstractXcoreRuntimeModule extends DefaultRuntimeModule { binder.bind(org.eclipse.xtext.resource.IResourceDescriptions.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider.NAMED_BUILDER_SCOPE)).to(org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions.class); } + // contributed by org.eclipse.xtext.generator.generator.GeneratorFragment + public Class bindIGenerator() { + return org.eclipse.emf.ecore.xcore.generator.XcoreGenerator.class; + } + // contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment public java.lang.ClassLoader bindClassLoaderToInstance() { return getClass().getClassLoader(); diff --git a/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/GenerateXcore.mwe2 b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/GenerateXcore.mwe2 index d9ce5e329..4c401f3bb 100644 --- a/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/GenerateXcore.mwe2 +++ b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/GenerateXcore.mwe2 @@ -122,6 +122,11 @@ Workflow { // quickfix API fragment = quickfix.QuickfixProviderFragment {} + fragment = generator.GeneratorFragment { + generateJavaMain = false + generateMwe = false + } + // Xbase support fragment = types.TypesGeneratorFragment {} fragment = xbase.XbaseGeneratorFragment { diff --git a/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/generator/XcoreGenerator.xtend b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/generator/XcoreGenerator.xtend new file mode 100644 index 000000000..7ccfbdde4 --- /dev/null +++ b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/generator/XcoreGenerator.xtend @@ -0,0 +1,53 @@ +/* + * generated by Xtext + */ +package org.eclipse.emf.ecore.xcore.generator + +import org.eclipse.emf.ecore.resource.Resource +import org.eclipse.xtext.generator.IGenerator +import org.eclipse.xtext.generator.IFileSystemAccess +import org.eclipse.emf.ecore.xcore.XPackage +import com.google.inject.Inject +import org.eclipse.emf.ecore.xcore.util.MappingFacade +import org.eclipse.emf.ecore.xcore.XOperation +import static extension org.eclipse.xtext.xtend2.lib.EObjectExtensions.* +import org.eclipse.xtext.xbase.compiler.XbaseCompiler +import org.eclipse.xtext.xbase.compiler.IAppendable +import org.eclipse.xtext.xbase.compiler.StringBuilderBasedAppendable +import org.eclipse.emf.ecore.EcoreFactory +import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage +import org.eclipse.emf.codegen.ecore.genmodel.GenModel + +class XcoreGenerator implements IGenerator { + + @Inject + extension MappingFacade mappings + + @Inject + XbaseCompiler compiler + + override void doGenerate(Resource resource, IFileSystemAccess fsa) { + val pack = resource.contents.head as XPackage + // install operation bodies + for (op : pack.allContentsIterable.filter(typeof(XOperation))) { + val eOperation = op.EOperation + val appendable = new StringBuilderBasedAppendable() + val expectedType = op.jvmOperation.returnType + compiler.compile(op.body, appendable, expectedType) + eOperation.EAnnotations.add(createGenModelAnnotation("body", appendable.toString)) + } + + generateGenModel(resource.contents.get(2) as GenModel) + } + + def generateGenModel(GenModel genModel) { + genModel.gen(null) + } + + def createGenModelAnnotation(String key, String value) { + val result = EcoreFactory::eINSTANCE.createEAnnotation + result.source = GenModelPackage::eNS_URI + result.details.put(key, value) + return result + } +} diff --git a/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/util/MappingFacade.xtend b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/util/MappingFacade.xtend new file mode 100644 index 000000000..ea00eae3d --- /dev/null +++ b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/util/MappingFacade.xtend @@ -0,0 +1,27 @@ +package org.eclipse.emf.ecore.xcore.util + +import org.eclipse.emf.ecore.xcore.XOperation +import org.eclipse.emf.ecore.EOperation +import org.eclipse.emf.codegen.ecore.genmodel.GenOperation +import org.eclipse.xtext.common.types.JvmOperation + +class MappingFacade { + + def getEOperation(XOperation op) { + XcoreEcoreBuilder::get(op) as EOperation + } + + def getGenOperation(XOperation op) { + XcoreEcoreBuilder::get(op) as GenOperation + } + + def getXOperation(GenOperation op) { + XcoreEcoreBuilder::get(op) as GenOperation + } + + def JvmOperation getJvmOperation(XOperation op) { + null //TODO + } + + +} \ No newline at end of file diff --git a/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/generator/XcoreGenerator.java b/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/generator/XcoreGenerator.java new file mode 100644 index 000000000..ffc929f91 --- /dev/null +++ b/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/generator/XcoreGenerator.java @@ -0,0 +1,79 @@ +package org.eclipse.emf.ecore.xcore.generator; + +import com.google.inject.Inject; +import org.eclipse.emf.codegen.ecore.genmodel.GenModel; +import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.EMap; +import org.eclipse.emf.ecore.EAnnotation; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EOperation; +import org.eclipse.emf.ecore.EcoreFactory; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.xcore.XOperation; +import org.eclipse.emf.ecore.xcore.XPackage; +import org.eclipse.emf.ecore.xcore.util.MappingFacade; +import org.eclipse.xtext.common.types.JvmOperation; +import org.eclipse.xtext.common.types.JvmTypeReference; +import org.eclipse.xtext.generator.IFileSystemAccess; +import org.eclipse.xtext.generator.IGenerator; +import org.eclipse.xtext.xbase.XBlockExpression; +import org.eclipse.xtext.xbase.compiler.StringBuilderBasedAppendable; +import org.eclipse.xtext.xbase.compiler.XbaseCompiler; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.eclipse.xtext.xtend2.lib.EObjectExtensions; + +@SuppressWarnings("all") +public class XcoreGenerator implements IGenerator { + + @Inject + private MappingFacade mappings; + + @Inject + private XbaseCompiler compiler; + + public void doGenerate(final Resource resource, final IFileSystemAccess fsa) { + { + EList _contents = resource.getContents(); + EObject _head = IterableExtensions.head(_contents); + final XPackage pack = ((XPackage) _head); + Iterable _allContentsIterable = EObjectExtensions.allContentsIterable(pack); + Iterable _filter = IterableExtensions.filter(_allContentsIterable, org.eclipse.emf.ecore.xcore.XOperation.class); + for (XOperation op : _filter) { + { + EOperation _eOperation = this.mappings.getEOperation(op); + final EOperation eOperation = _eOperation; + StringBuilderBasedAppendable _stringBuilderBasedAppendable = new StringBuilderBasedAppendable(); + final StringBuilderBasedAppendable appendable = _stringBuilderBasedAppendable; + JvmOperation _jvmOperation = this.mappings.getJvmOperation(op); + JvmTypeReference _returnType = _jvmOperation.getReturnType(); + final JvmTypeReference expectedType = _returnType; + XBlockExpression _body = op.getBody(); + this.compiler.compile(_body, appendable, expectedType); + EList _eAnnotations = eOperation.getEAnnotations(); + String _string = appendable.toString(); + EAnnotation _createGenModelAnnotation = this.createGenModelAnnotation("body", _string); + _eAnnotations.add(_createGenModelAnnotation); + } + } + EList _contents_1 = resource.getContents(); + EObject _get = _contents_1.get(2); + this.generateGenModel(((GenModel) _get)); + } + } + + public void generateGenModel(final GenModel genModel) { + genModel.gen(null); + } + + public EAnnotation createGenModelAnnotation(final String key, final String value) { + { + EAnnotation _createEAnnotation = EcoreFactory.eINSTANCE.createEAnnotation(); + final EAnnotation result = _createEAnnotation; + result.setSource(GenModelPackage.eNS_URI); + EMap _details = result.getDetails(); + _details.put(key, value); + return result; + } + } +} \ No newline at end of file diff --git a/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/util/MappingFacade.java b/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/util/MappingFacade.java new file mode 100644 index 000000000..70c83e7ca --- /dev/null +++ b/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/util/MappingFacade.java @@ -0,0 +1,31 @@ +package org.eclipse.emf.ecore.xcore.util; + +import org.eclipse.emf.codegen.ecore.genmodel.GenOperation; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EOperation; +import org.eclipse.emf.ecore.xcore.XOperation; +import org.eclipse.emf.ecore.xcore.util.XcoreEcoreBuilder; +import org.eclipse.xtext.common.types.JvmOperation; + +@SuppressWarnings("all") +public class MappingFacade { + + public EOperation getEOperation(final XOperation op) { + EObject _get = XcoreEcoreBuilder.get(op); + return ((EOperation) _get); + } + + public GenOperation getGenOperation(final XOperation op) { + EObject _get = XcoreEcoreBuilder.get(op); + return ((GenOperation) _get); + } + + public GenOperation getXOperation(final GenOperation op) { + EObject _get = XcoreEcoreBuilder.get(op); + return ((GenOperation) _get); + } + + public JvmOperation getJvmOperation(final XOperation op) { + return null; + } +} \ No newline at end of file -- cgit v1.2.3