From ce66736691ef0e6d11cda190fe95c92886af80e2 Mon Sep 17 00:00:00 2001 From: Christian Schneider Date: Wed, 7 Oct 2015 09:19:24 +0200 Subject: [PATCH 1/2] [xtext generator] Migration of LabelProviderFragment Signed-off-by: Christian Schneider --- .../META-INF/MANIFEST.MF | 1 + .../ui/labeling/LabelProviderFragment2.xtend | 235 ++++++++++++++++++ .../wizard/RuntimeProjectDescriptor.xtend | 5 +- .../xtext/example/mydsl/GenerateMyDsl.mwe2 | 5 +- .../xtext/example/mydsl/GenerateMyDsl.mwe2 | 5 +- .../xtext/example/mydsl/GenerateMyDsl.mwe2 | 5 +- 6 files changed, 244 insertions(+), 12 deletions(-) create mode 100644 plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend diff --git a/plugins/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF b/plugins/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF index c55856c41..76fb8f231 100644 --- a/plugins/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.xtext.xtext.generator/META-INF/MANIFEST.MF @@ -44,6 +44,7 @@ Export-Package: org.eclipse.xtext.xtext.generator, org.eclipse.xtext.xtext.generator.scoping, org.eclipse.xtext.xtext.generator.types, org.eclipse.xtext.xtext.generator.ui.contentAssist, + org.eclipse.xtext.xtext.generator.ui.labeling, org.eclipse.xtext.xtext.generator.ui.outline, org.eclipse.xtext.xtext.generator.ui.quickfix, org.eclipse.xtext.xtext.generator.util, diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend new file mode 100644 index 000000000..2135b3910 --- /dev/null +++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend @@ -0,0 +1,235 @@ +/******************************************************************************* + * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.xtext.generator.ui.labeling + +import com.google.inject.Inject +import org.eclipse.xtend.lib.annotations.Accessors +import org.eclipse.xtext.Grammar +import org.eclipse.xtext.xtext.generator.AbstractGeneratorFragment2 +import org.eclipse.xtext.xtext.generator.CodeConfig +import org.eclipse.xtext.xtext.generator.XtextGeneratorNaming +import org.eclipse.xtext.xtext.generator.model.FileAccessFactory +import org.eclipse.xtext.xtext.generator.model.GuiceModuleAccess +import org.eclipse.xtext.xtext.generator.model.TypeReference +import org.eclipse.xtext.xtext.generator.xbase.XbaseUsageDetector + +import static extension org.eclipse.xtext.GrammarUtil.* + +/** + * Contributes the Labeling provider stub, either in Xtend or Java language. + * + * @author Christian Schneider - Initial contribution and API + */ +class LabelProviderFragment2 extends AbstractGeneratorFragment2 { + + private static val XBASE_LABEL_PROVIDER = + "org.eclipse.xtext.xbase.ui.labeling.XbaseLabelProvider" + + private static val XBASE_DESCRIPTION_LABEL_PROVIDER = + "org.eclipse.xtext.xbase.ui.labeling.XbaseDescriptionLabelProvider" + + @Inject + extension XtextGeneratorNaming + + @Inject + extension XbaseUsageDetector + + @Inject + extension CodeConfig + + @Inject + FileAccessFactory fileAccessFactory + + @Accessors + private boolean generateStub = true; + + def protected TypeReference getEObjectLabelProviderClass(Grammar g) { + return new TypeReference( + g.eclipsePluginBasePackage + ".labeling." + g.simpleName + "LabelProvider" + ) + } + + def protected TypeReference getEObjectLabelProviderSuperClass(Grammar g) { + if (g.inheritsXbase) + new TypeReference(XBASE_LABEL_PROVIDER) + else defaultEObjectLabelProviderSuperClass + } + + /** + * Extra getter facilitates customization by overriding. + */ + def protected TypeReference getDefaultEObjectLabelProviderSuperClass() { + new TypeReference("org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider") + } + + + def protected TypeReference getDescriptionLabelProviderClass(Grammar g) { + return new TypeReference( + g.eclipsePluginBasePackage + ".labeling." + g.simpleName + "DescriptionLabelProvider" + ) + } + + def protected TypeReference getDescriptionLabelProviderSuperClass(Grammar g) { + if (g.inheritsXbase) + new TypeReference(XBASE_DESCRIPTION_LABEL_PROVIDER) + else defaultDescriptionLabelProviderSuperClass + } + + /** + * Extra getter facilitates customization by overriding. + */ + def protected TypeReference getDefaultDescriptionLabelProviderSuperClass() { + new TypeReference("org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider") + } + + + override generate() { + if (!generateStub && !grammar.inheritsXbase) { + // the binding of the DefaultEObjectLabelProvider and the + // DefaultDescriptionLabelProvider is done in the DefaultUIModule, so ... + return; + } + + if (projectConfig.eclipsePluginManifest != null) { + projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.ui" + } + + val labelProviderClass = + if (generateStub) grammar.EObjectLabelProviderClass + else new TypeReference(XBASE_LABEL_PROVIDER) + + val descriptionLabelProviderClass = + if (generateStub) grammar.descriptionLabelProviderClass + else new TypeReference(XBASE_DESCRIPTION_LABEL_PROVIDER) + + val iLabelProviderClass = new TypeReference("org.eclipse.jface.viewers.ILabelProvider") + val rsdLabelProviderClass = + new TypeReference("org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider") + + new GuiceModuleAccess.BindingFactory() + .addTypeToType(iLabelProviderClass, labelProviderClass) + .addConfiguredBinding("ResourceUIServiceLabelProvider", ''' + binder.bind(«iLabelProviderClass».class).annotatedWith(« + rsdLabelProviderClass».class).to(«descriptionLabelProviderClass».class); + ''').contributeTo(language.eclipsePluginGenModule) + + if (!generateStub) { + return; + } + + if (projectConfig.eclipsePluginSrc !== null) { + if (preferXtendStubs) { + generateXtendEObjectLabelProvider + generateXtendDescriptionLabelProvider + } else { + generateJavaEObjectLabelProvider + generateJavaDescriptionLabelProvider + } + } + } + + def protected generateXtendEObjectLabelProvider() { + fileAccessFactory.createXtendFile(grammar.EObjectLabelProviderClass, ''' + /** + * Provides labels for EObjects. + * + * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider + */ + class «grammar.EObjectLabelProviderClass.simpleName» extends «grammar.EObjectLabelProviderSuperClass» { + + @«Inject» + new(«new TypeReference("org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider")» delegate) { + super(delegate); + } + + // Labels and icons can be computed like this: + + // def text(Greeting ele) { + // 'A greeting to ' + ele.name + // } + // + // def image(Greeting ele) { + // 'Greeting.gif' + // } + } + ''').writeTo(projectConfig.eclipsePluginSrc) + } + + def protected generateXtendDescriptionLabelProvider() { + fileAccessFactory.createXtendFile(grammar.descriptionLabelProviderClass, ''' + /** + * Provides labels for IEObjectDescriptions and IResourceDescriptions. + * + * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider + */ + class «grammar.descriptionLabelProviderClass.simpleName» extends «grammar.descriptionLabelProviderSuperClass» { + + // Labels and icons can be computed like this: + + // override text(IEObjectDescription ele) { + // ele.name.toString + // } + // + // override image(IEObjectDescription ele) { + // ele.EClass.name + '.gif' + // } + } + ''').writeTo(projectConfig.eclipsePluginSrc) + } + + def protected generateJavaEObjectLabelProvider() { + fileAccessFactory.createJavaFile(grammar.EObjectLabelProviderClass, ''' + /** + * Provides labels for EObjects. + * + * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider + */ + public class «grammar.EObjectLabelProviderClass.simpleName» extends «grammar.EObjectLabelProviderSuperClass» { + + @«Inject» + public «grammar.EObjectLabelProviderClass.simpleName»(« + new TypeReference("org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider") + » delegate) { + super(delegate); + } + + // Labels and icons can be computed like this: + + // String text(Greeting ele) { + // return "A greeting to " + ele.getName(); + // } + // + // String image(Greeting ele) { + // return "Greeting.gif"; + // } + } + ''').writeTo(projectConfig.eclipsePluginSrc) + } + + def protected generateJavaDescriptionLabelProvider() { + fileAccessFactory.createJavaFile(grammar.descriptionLabelProviderClass, ''' + /** + * Provides labels for IEObjectDescriptions and IResourceDescriptions. + * + * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider + */ + public class «grammar.descriptionLabelProviderClass.simpleName» extends «grammar.descriptionLabelProviderSuperClass» { + + // Labels and icons can be computed like this: + + // String text(IEObjectDescription ele) { + // return ele.getName().toString(); + // } + // + // String image(IEObjectDescription ele) { + // return ele.getEClass().getName() + ".gif"; + // } + } + ''').writeTo(projectConfig.eclipsePluginSrc) + } +} \ No newline at end of file diff --git a/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend b/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend index 91afdb360..037a6f054 100644 --- a/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend +++ b/plugins/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend @@ -266,10 +266,9 @@ class RuntimeProjectDescriptor extends TestedProjectDescriptor { «IF config.uiProject.enabled» fragment = builder.BuilderIntegrationFragment2 auto-inject {} + // labeling API - fragment = adapter.FragmentAdapter { - fragment = labeling.LabelProviderFragment auto-inject {} - } + fragment = ui.labeling.LabelProviderFragment2 auto-inject {} // outline API fragment = ui.outline.OutlineTreeProviderFragment2 auto-inject {} diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 index 5dbeb72ca..eb7e94037 100644 --- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 +++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.eclipsePlugin/org.xtext.example.eclipsePlugin/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 @@ -77,10 +77,9 @@ Workflow { fragment = junit.Junit4Fragment2 auto-inject {} fragment = builder.BuilderIntegrationFragment2 auto-inject {} + // labeling API - fragment = adapter.FragmentAdapter { - fragment = labeling.LabelProviderFragment auto-inject {} - } + fragment = ui.labeling.LabelProviderFragment2 auto-inject {} // outline API fragment = ui.outline.OutlineTreeProviderFragment2 auto-inject {} diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 index cabbb5a4e..a7fa1a76d 100644 --- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 +++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 @@ -79,10 +79,9 @@ Workflow { fragment = junit.Junit4Fragment2 auto-inject {} fragment = builder.BuilderIntegrationFragment2 auto-inject {} + // labeling API - fragment = adapter.FragmentAdapter { - fragment = labeling.LabelProviderFragment auto-inject {} - } + fragment = ui.labeling.LabelProviderFragment2 auto-inject {} // outline API fragment = ui.outline.OutlineTreeProviderFragment2 auto-inject {} diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 index ec29aaf52..8db4679d1 100644 --- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 +++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/src/org/xtext/example/mydsl/GenerateMyDsl.mwe2 @@ -78,10 +78,9 @@ Workflow { fragment = junit.Junit4Fragment2 auto-inject {} fragment = builder.BuilderIntegrationFragment2 auto-inject {} + // labeling API - fragment = adapter.FragmentAdapter { - fragment = labeling.LabelProviderFragment auto-inject {} - } + fragment = ui.labeling.LabelProviderFragment2 auto-inject {} // outline API fragment = ui.outline.OutlineTreeProviderFragment2 auto-inject {} From ec73ec8ae4d85c629feaa65308190593023a8cce Mon Sep 17 00:00:00 2001 From: Christian Schneider Date: Thu, 8 Oct 2015 14:54:56 +0200 Subject: [PATCH 2/2] [xtext generator] improved 'LabelProviderFragment2' as suggested in review Signed-off-by: Christian Schneider --- .../ui/labeling/LabelProviderFragment2.xtend | 57 ++++++++----------- 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend index 2135b3910..4859ab7b6 100644 --- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend +++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/ui/labeling/LabelProviderFragment2.xtend @@ -89,40 +89,33 @@ class LabelProviderFragment2 extends AbstractGeneratorFragment2 { override generate() { - if (!generateStub && !grammar.inheritsXbase) { - // the binding of the DefaultEObjectLabelProvider and the - // DefaultDescriptionLabelProvider is done in the DefaultUIModule, so ... - return; + if (generateStub || grammar.inheritsXbase) { + + if (projectConfig.eclipsePluginManifest != null) { + projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.ui" + } + + val labelProviderClass = + if (generateStub) grammar.EObjectLabelProviderClass + else new TypeReference(XBASE_LABEL_PROVIDER) + + val descriptionLabelProviderClass = + if (generateStub) grammar.descriptionLabelProviderClass + else new TypeReference(XBASE_DESCRIPTION_LABEL_PROVIDER) + + val iLabelProviderClass = new TypeReference("org.eclipse.jface.viewers.ILabelProvider") + val rsdLabelProviderClass = + new TypeReference("org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider") + + new GuiceModuleAccess.BindingFactory() + .addTypeToType(iLabelProviderClass, labelProviderClass) + .addConfiguredBinding("ResourceUIServiceLabelProvider", ''' + binder.bind(«iLabelProviderClass».class).annotatedWith(« + rsdLabelProviderClass».class).to(«descriptionLabelProviderClass».class); + ''').contributeTo(language.eclipsePluginGenModule) } - if (projectConfig.eclipsePluginManifest != null) { - projectConfig.eclipsePluginManifest.requiredBundles += "org.eclipse.xtext.ui" - } - - val labelProviderClass = - if (generateStub) grammar.EObjectLabelProviderClass - else new TypeReference(XBASE_LABEL_PROVIDER) - - val descriptionLabelProviderClass = - if (generateStub) grammar.descriptionLabelProviderClass - else new TypeReference(XBASE_DESCRIPTION_LABEL_PROVIDER) - - val iLabelProviderClass = new TypeReference("org.eclipse.jface.viewers.ILabelProvider") - val rsdLabelProviderClass = - new TypeReference("org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider") - - new GuiceModuleAccess.BindingFactory() - .addTypeToType(iLabelProviderClass, labelProviderClass) - .addConfiguredBinding("ResourceUIServiceLabelProvider", ''' - binder.bind(«iLabelProviderClass».class).annotatedWith(« - rsdLabelProviderClass».class).to(«descriptionLabelProviderClass».class); - ''').contributeTo(language.eclipsePluginGenModule) - - if (!generateStub) { - return; - } - - if (projectConfig.eclipsePluginSrc !== null) { + if (generateStub && projectConfig.eclipsePluginSrc !== null) { if (preferXtendStubs) { generateXtendEObjectLabelProvider generateXtendDescriptionLabelProvider