[431435] Bind generated EPackage and EFactory

Signed-off-by: Karsten Thoms <karsten.thoms@itemis.de>
This commit is contained in:
Karsten Thoms 2016-08-11 21:17:46 +02:00
parent 4a0a1591a7
commit a94438ea69
2 changed files with 72 additions and 0 deletions

View file

@ -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 <code>eINSTANCE</code> 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

View file

@ -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 <code>eINSTANCE</code> 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);
}