From 609e2c71073e611ba85d6c5dd576653ebf0ec9db Mon Sep 17 00:00:00 2001 From: Stefan Oehme Date: Tue, 6 Oct 2015 14:21:57 +0200 Subject: [PATCH] [generator2] directory cleaner that understands XtextProjectConfig --- .../generator/XtextDirectoryCleaner.xtend | 67 +++++++++++++++++++ .../xtext/generator/XtextGenerator.xtend | 5 ++ .../wizard/RuntimeProjectDescriptor.xtend | 22 ++---- .../xtext/example/mydsl/GenerateMyDsl.mwe2 | 31 ++------- .../xtext/example/mydsl/GenerateMyDsl.mwe2 | 37 ++-------- .../xtext/example/mydsl/GenerateMyDsl.mwe2 | 28 ++------ .../xtext/example/mydsl/GenerateMyDsl.mwe2 | 34 ++-------- .../xtext/example/mydsl/GenerateMyDsl.mwe2 | 25 ++----- 8 files changed, 97 insertions(+), 152 deletions(-) create mode 100644 plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextDirectoryCleaner.xtend diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextDirectoryCleaner.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextDirectoryCleaner.xtend new file mode 100644 index 000000000..ae6ea810d --- /dev/null +++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextDirectoryCleaner.xtend @@ -0,0 +1,67 @@ +/******************************************************************************* + * 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 + +import com.google.inject.Inject +import com.google.inject.Injector +import java.util.List +import org.eclipse.emf.mwe.utils.DirectoryCleaner +import org.eclipse.xtend.lib.annotations.Accessors +import java.io.File + +class XtextDirectoryCleaner implements IGuiceAwareGeneratorComponent { + @Inject IXtextProjectConfig config + + @Accessors(PUBLIC_SETTER) + boolean enabled = true + @Accessors(PUBLIC_SETTER) + boolean useDefaultExcludes = true + + List excludes = newArrayList + List extraDirectories = newArrayList + + def void addExtraDirectory(String directory) { + extraDirectories += directory + } + + def void addExclude(String exclude) { + excludes += exclude + } + + def void clean() { + if (!enabled) + return; + + val directories = newArrayList + directories += #[ + config.runtimeModelGen, + config.runtimeSrcGen, + config.runtimeTestSrcGen, + config.genericIdeSrcGen, + config.genericIdeTestSrcGen, + config.eclipsePluginSrcGen, + config.eclipsePluginTestSrcGen, + config.ideaPluginSrcGen, + config.ideaPluginTestSrcGen, + config.webSrcGen, + config.webTestSrcGen + ].filterNull.map[path].filter[new File(it).isDirectory] + directories += extraDirectories + + val delegate = new DirectoryCleaner + delegate.useDefaultExcludes = useDefaultExcludes + excludes.forEach[delegate.addExclude(it)] + + directories.forEach[delegate.cleanFolder(it)] + } + + override initialize(Injector injector) { + injector.injectMembers(this) + } + +} \ No newline at end of file diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGenerator.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGenerator.xtend index 3af037832..c72bdab81 100644 --- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGenerator.xtend +++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/XtextGenerator.xtend @@ -50,6 +50,9 @@ class XtextGenerator extends AbstractWorkflowComponent2 { @Accessors val List languageConfigs = newArrayList + @Accessors + XtextDirectoryCleaner cleaner = new XtextDirectoryCleaner + Injector injector @Inject IXtextProjectConfig projectConfig @@ -96,6 +99,7 @@ class XtextGenerator extends AbstractWorkflowComponent2 { injector.injectMembers(this) injector.getInstance(CodeConfig) => [initialize(injector)] projectConfig.initialize(injector) + cleaner.initialize(injector) for (language : languageConfigs) { val languageInjector = injector.createLanguageInjector(language) language.initialize(languageInjector) @@ -113,6 +117,7 @@ class XtextGenerator extends AbstractWorkflowComponent2 { protected override invokeInternal(WorkflowContext ctx, ProgressMonitor monitor, org.eclipse.emf.mwe.core.issues.Issues issues) { initialize + cleaner.clean for (language : languageConfigs) { LOG.info('Generating ' + language.grammar.name) language.generate 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 b0dad490b..066e289e7 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 @@ -158,13 +158,9 @@ class RuntimeProjectDescriptor extends TestedProjectDescriptor { var baseName = "«name»" var rootPath = ".." +««« TODO move down when all fragments are migrated var fileExtensions = "«config.language.fileExtensions»" - var grammarURI = "platform:/resource/${baseName}/«Outlet.MAIN_JAVA.sourceFolder»/«grammarFilePath»" - var encoding = "«config.encoding»" - var lineDelimiter = "\n" - var fileHeader = "/*\n * generated by Xtext \${version}\n */" - Workflow { bean = StandaloneSetup { scanClassPath = true @@ -183,16 +179,6 @@ class RuntimeProjectDescriptor extends TestedProjectDescriptor { «ENDIF» } - «FOR p : config.enabledProjects.filter[it.sourceFolders.contains(Outlet.MAIN_SRC_GEN.sourceFolder)]» - component = DirectoryCleaner { - directory = "${rootPath}/«p.name»/«Outlet.MAIN_SRC_GEN.sourceFolder»" - } - «ENDFOR» - - component = DirectoryCleaner { - directory = "${rootPath}/«name»/model/generated" - } - component = XtextGenerator auto-inject { configuration = { project = WizardConfig auto-inject { @@ -216,11 +202,13 @@ class RuntimeProjectDescriptor extends TestedProjectDescriptor { «ENDIF» } code = auto-inject { - preferXtendStubs = true + encoding = "«config.encoding»" + lineDelimiter = "\n" + fileHeader = "/*\n * generated by Xtext \${version}\n */" } } language = auto-inject { - uri = grammarURI + uri = "platform:/resource/${baseName}/«Outlet.MAIN_JAVA.sourceFolder»/«grammarFilePath»" «FOR genmodelURI : config.ecore2Xtext.EPackageInfos.filter[genmodelURI.fileExtension == "xcore"].map[genmodelURI.toString].toSet» loadedResource = "«genmodelURI»" «ENDFOR» 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 17c38695d..039b9407e 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 @@ -9,11 +9,6 @@ var baseName = "org.xtext.example.eclipsePlugin" var rootPath = ".." var fileExtensions = "mydsl" -var grammarURI = "platform:/resource/${baseName}/src/org/xtext/example/mydsl/MyDsl.xtext" - -var encoding = "UTF-8" -var lineDelimiter = "\n" -var fileHeader = "/*\n * generated by Xtext \${version}\n */" Workflow { bean = StandaloneSetup { @@ -24,26 +19,6 @@ Workflow { registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel" } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.eclipsePlugin/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.eclipsePlugin.ide/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.eclipsePlugin.ui/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.eclipsePlugin.tests/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.eclipsePlugin.ui.tests/src-gen" - } - - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.eclipsePlugin/model/generated" - } - component = XtextGenerator auto-inject { configuration = { project = WizardConfig auto-inject { @@ -51,11 +26,13 @@ Workflow { testingSupport = true } code = auto-inject { - preferXtendStubs = true + encoding = "UTF-8" + lineDelimiter = "\n" + fileHeader = "/*\n * generated by Xtext \${version}\n */" } } language = auto-inject { - uri = grammarURI + uri = "platform:/resource/${baseName}/src/org/xtext/example/mydsl/MyDsl.xtext" // Java API to access grammar elements (required by several other fragments) fragment = grammarAccess.GrammarAccessFragment2 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 cb7dec168..0b9f83d92 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 @@ -9,11 +9,6 @@ var baseName = "org.xtext.example.full" var rootPath = ".." var fileExtensions = "mydsl" -var grammarURI = "platform:/resource/${baseName}/src/org/xtext/example/mydsl/MyDsl.xtext" - -var encoding = "UTF-8" -var lineDelimiter = "\n" -var fileHeader = "/*\n * generated by Xtext \${version}\n */" Workflow { bean = StandaloneSetup { @@ -24,32 +19,6 @@ Workflow { registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel" } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.full/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.full.ide/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.full.ui/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.full.idea/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.full.web/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.full.tests/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.full.ui.tests/src-gen" - } - - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.full/model/generated" - } - component = XtextGenerator auto-inject { configuration = { project = WizardConfig auto-inject { @@ -59,11 +28,13 @@ Workflow { testingSupport = true } code = auto-inject { - preferXtendStubs = true + encoding = "UTF-8" + lineDelimiter = "\n" + fileHeader = "/*\n * generated by Xtext \${version}\n */" } } language = auto-inject { - uri = grammarURI + uri = "platform:/resource/${baseName}/src/org/xtext/example/mydsl/MyDsl.xtext" // Java API to access grammar elements (required by several other fragments) fragment = grammarAccess.GrammarAccessFragment2 auto-inject {} diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 index ccd8510da..261541ba1 100644 --- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 +++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 @@ -9,11 +9,6 @@ var baseName = "org.xtext.example.gradle" var rootPath = ".." var fileExtensions = "mydsl" -var grammarURI = "platform:/resource/${baseName}/src/main/java/org/xtext/example/mydsl/MyDsl.xtext" - -var encoding = "UTF-8" -var lineDelimiter = "\n" -var fileHeader = "/*\n * generated by Xtext \${version}\n */" Workflow { bean = StandaloneSetup { @@ -24,23 +19,6 @@ Workflow { registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel" } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.gradle/src/main/xtext-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.gradle.ide/src/main/xtext-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.gradle.idea/src/main/xtext-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.gradle.web/src/main/xtext-gen" - } - - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.gradle/model/generated" - } - component = XtextGenerator auto-inject { configuration = { project = WizardConfig auto-inject { @@ -52,11 +30,13 @@ Workflow { mavenLayout = true } code = auto-inject { - preferXtendStubs = true + encoding = "UTF-8" + lineDelimiter = "\n" + fileHeader = "/*\n * generated by Xtext \${version}\n */" } } language = auto-inject { - uri = grammarURI + uri = "platform:/resource/${baseName}/src/main/java/org/xtext/example/mydsl/MyDsl.xtext" // Java API to access grammar elements (required by several other fragments) fragment = grammarAccess.GrammarAccessFragment2 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 305893cde..2058e0bb3 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 @@ -9,11 +9,6 @@ var baseName = "org.xtext.example.mavenTycho" var rootPath = ".." var fileExtensions = "mydsl" -var grammarURI = "platform:/resource/${baseName}/src/org/xtext/example/mydsl/MyDsl.xtext" - -var encoding = "UTF-8" -var lineDelimiter = "\n" -var fileHeader = "/*\n * generated by Xtext \${version}\n */" Workflow { bean = StandaloneSetup { @@ -24,29 +19,6 @@ Workflow { registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel" } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.mavenTycho/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.mavenTycho.ide/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.mavenTycho.ui/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.mavenTycho.web/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.mavenTycho.tests/src-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.mavenTycho.ui.tests/src-gen" - } - - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.mavenTycho/model/generated" - } - component = XtextGenerator auto-inject { configuration = { project = WizardConfig auto-inject { @@ -55,11 +27,13 @@ Workflow { testingSupport = true } code = auto-inject { - preferXtendStubs = true + encoding = "UTF-8" + lineDelimiter = "\n" + fileHeader = "/*\n * generated by Xtext \${version}\n */" } } language = auto-inject { - uri = grammarURI + uri = "platform:/resource/${baseName}/src/org/xtext/example/mydsl/MyDsl.xtext" // Java API to access grammar elements (required by several other fragments) fragment = grammarAccess.GrammarAccessFragment2 auto-inject {} diff --git a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.plainMaven/org.xtext.example.plainMaven.parent/org.xtext.example.plainMaven/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.plainMaven/org.xtext.example.plainMaven.parent/org.xtext.example.plainMaven/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 index fd7aae84a..513dd4214 100644 --- a/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.plainMaven/org.xtext.example.plainMaven.parent/org.xtext.example.plainMaven/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 +++ b/tests/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.plainMaven/org.xtext.example.plainMaven.parent/org.xtext.example.plainMaven/src/main/java/org/xtext/example/mydsl/GenerateMyDsl.mwe2 @@ -9,11 +9,6 @@ var baseName = "org.xtext.example.plainMaven" var rootPath = ".." var fileExtensions = "mydsl" -var grammarURI = "platform:/resource/${baseName}/src/main/java/org/xtext/example/mydsl/MyDsl.xtext" - -var encoding = "UTF-8" -var lineDelimiter = "\n" -var fileHeader = "/*\n * generated by Xtext \${version}\n */" Workflow { bean = StandaloneSetup { @@ -24,20 +19,6 @@ Workflow { registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel" } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.plainMaven/src/main/xtext-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.plainMaven.ide/src/main/xtext-gen" - } - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.plainMaven.web/src/main/xtext-gen" - } - - component = DirectoryCleaner { - directory = "${rootPath}/org.xtext.example.plainMaven/model/generated" - } - component = XtextGenerator auto-inject { configuration = { project = WizardConfig auto-inject { @@ -48,11 +29,13 @@ Workflow { mavenLayout = true } code = auto-inject { - preferXtendStubs = true + encoding = "UTF-8" + lineDelimiter = "\n" + fileHeader = "/*\n * generated by Xtext \${version}\n */" } } language = auto-inject { - uri = grammarURI + uri = "platform:/resource/${baseName}/src/main/java/org/xtext/example/mydsl/MyDsl.xtext" // Java API to access grammar elements (required by several other fragments) fragment = grammarAccess.GrammarAccessFragment2 auto-inject {}