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);
}