From a94438ea69eb38c4fae1a661ac49d7075d0ab202 Mon Sep 17 00:00:00 2001 From: Karsten Thoms Date: Thu, 11 Aug 2016 21:17:46 +0200 Subject: [PATCH] [431435] Bind generated EPackage and EFactory Signed-off-by: Karsten Thoms --- .../ecore/EMFGeneratorFragment2.xtend | 25 ++++++++++ .../ecore/EMFGeneratorFragment2.java | 47 +++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.xtend index 76f4b6aad..3f3a18628 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.xtend +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.xtend @@ -37,6 +37,7 @@ import org.eclipse.emf.common.util.BasicMonitor import org.eclipse.emf.common.util.Diagnostic import org.eclipse.emf.common.util.URI import org.eclipse.emf.ecore.EClassifier +import org.eclipse.emf.ecore.EFactory import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EPackage import org.eclipse.emf.ecore.EReference @@ -66,10 +67,12 @@ import org.eclipse.xtext.util.Strings import org.eclipse.xtext.util.internal.Log import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment import org.eclipse.xtext.xtext.generator.CodeConfig +import org.eclipse.xtext.xtext.generator.model.GuiceModuleAccess import org.eclipse.xtext.xtext.generator.model.TypeReference import static org.eclipse.xtext.GrammarUtil.* +import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.* import static extension org.eclipse.xtext.xtext.generator.util.GenModelUtil2.* @Log @@ -196,6 +199,16 @@ class EMFGeneratorFragment2 extends AbstractXtextGeneratorFragment { LOG.warn('Illegal JDK level: ' + jdkLevel) } + boolean bindEPackageAndEFactory = false + + /** + * If set generated {@link EPackage} and {@link EFactory} interfaces are bound to their eINSTANCE instance. + * @since 2.11 + */ + public def void setBindEPackageAndEFactory (boolean bindEPackageAndEFactory) { + this.bindEPackageAndEFactory = bindEPackageAndEFactory + } + protected def String getModelPluginID() { modelPluginID ?: projectConfig.runtime.name } @@ -320,6 +333,18 @@ class EMFGeneratorFragment2 extends AbstractXtextGeneratorFragment { doGenerate(genModel) addProjectContributions(clonedGrammar, generatedPackages, workingResourceSet) + + // Register generated EPackage and EFactory instances in the runtime module + if (bindEPackageAndEFactory) { + for (pkg: generatedPackages) { + val genPkg = getGenPackage(pkg, genModel.eResource.resourceSet) + + new GuiceModuleAccess.BindingFactory() + .addTypeToInstance(genPkg.qualifiedPackageInterfaceName.typeRef, '''«genPkg.packageInterfaceName».eINSTANCE''') + .addTypeToInstance(genPkg.qualifiedFactoryInterfaceName.typeRef, '''«genPkg.factoryInterfaceName».eINSTANCE''') + .contributeTo(language.runtimeGenModule) + } + } } // Finally save the ecore packages to the file system diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.java index 703ed81fa..3a59dc239 100644 --- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.java +++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/ecore/EMFGeneratorFragment2.java @@ -48,6 +48,7 @@ import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; @@ -90,6 +91,7 @@ import org.eclipse.xtext.xbase.lib.StringExtensions; import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment; import org.eclipse.xtext.xtext.generator.CodeConfig; import org.eclipse.xtext.xtext.generator.IXtextGeneratorLanguage; +import org.eclipse.xtext.xtext.generator.model.GuiceModuleAccess; import org.eclipse.xtext.xtext.generator.model.IXtextGeneratorFileSystemAccess; import org.eclipse.xtext.xtext.generator.model.ManifestAccess; import org.eclipse.xtext.xtext.generator.model.PluginXmlAccess; @@ -229,6 +231,16 @@ public class EMFGeneratorFragment2 extends AbstractXtextGeneratorFragment { } } + private boolean bindEPackageAndEFactory = false; + + /** + * If set generated {@link EPackage} and {@link EFactory} interfaces are bound to their eINSTANCE instance. + * @since 2.11 + */ + public void setBindEPackageAndEFactory(final boolean bindEPackageAndEFactory) { + this.bindEPackageAndEFactory = bindEPackageAndEFactory; + } + protected String getModelPluginID() { String _elvis = null; if (this.modelPluginID != null) { @@ -482,6 +494,41 @@ public class EMFGeneratorFragment2 extends AbstractXtextGeneratorFragment { genModel.reconcile(); this.doGenerate(genModel); this.addProjectContributions(clonedGrammar, generatedPackages, workingResourceSet); + if (this.bindEPackageAndEFactory) { + for (final EPackage pkg : generatedPackages) { + { + Resource _eResource_1 = genModel.eResource(); + ResourceSet _resourceSet = _eResource_1.getResourceSet(); + final GenPackage genPkg = GenModelUtil2.getGenPackage(pkg, _resourceSet); + GuiceModuleAccess.BindingFactory _bindingFactory = new GuiceModuleAccess.BindingFactory(); + String _qualifiedPackageInterfaceName = genPkg.getQualifiedPackageInterfaceName(); + TypeReference _typeRef = TypeReference.typeRef(_qualifiedPackageInterfaceName); + StringConcatenationClient _client = new StringConcatenationClient() { + @Override + protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) { + String _packageInterfaceName = genPkg.getPackageInterfaceName(); + _builder.append(_packageInterfaceName, ""); + _builder.append(".eINSTANCE"); + } + }; + GuiceModuleAccess.BindingFactory _addTypeToInstance = _bindingFactory.addTypeToInstance(_typeRef, _client); + String _qualifiedFactoryInterfaceName = genPkg.getQualifiedFactoryInterfaceName(); + TypeReference _typeRef_1 = TypeReference.typeRef(_qualifiedFactoryInterfaceName); + StringConcatenationClient _client_1 = new StringConcatenationClient() { + @Override + protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) { + String _factoryInterfaceName = genPkg.getFactoryInterfaceName(); + _builder.append(_factoryInterfaceName, ""); + _builder.append(".eINSTANCE"); + } + }; + GuiceModuleAccess.BindingFactory _addTypeToInstance_1 = _addTypeToInstance.addTypeToInstance(_typeRef_1, _client_1); + IXtextGeneratorLanguage _language = this.getLanguage(); + GuiceModuleAccess _runtimeGenModule = _language.getRuntimeGenModule(); + _addTypeToInstance_1.contributeTo(_runtimeGenModule); + } + } + } } this.saveResource(ePackageResource); }