diff --git a/gradle/java-compiler-settings.gradle b/gradle/java-compiler-settings.gradle index 25604b11a..0e79deb06 100644 --- a/gradle/java-compiler-settings.gradle +++ b/gradle/java-compiler-settings.gradle @@ -17,12 +17,7 @@ tasks.withType(Javadoc) { } sourceSets { - mwe2 { - java { - compileClasspath += main.output - runtimeClasspath += main.output - } - } + mwe2 {} } configurations { diff --git a/gradle/p2-deployment.gradle b/gradle/p2-deployment.gradle index 91b0b32a3..805293e3b 100644 --- a/gradle/p2-deployment.gradle +++ b/gradle/p2-deployment.gradle @@ -8,6 +8,8 @@ apply plugin: 'io.typefox.gradle.p2gen' group = 'org.eclipse.xtext' p2gen { + exclude 'org.eclipse.xtext.xtext.bootstrap' + dependencies { repositoryUrl "http://download.eclipse.org/modeling/tmf/xtext/updates/releases/${versions.xtext_bootstrap}/" feature 'org.eclipse.xtext.sdk' diff --git a/org.eclipse.xtext.xtext.bootstrap/.classpath b/org.eclipse.xtext.xtext.bootstrap/.classpath new file mode 100644 index 000000000..8a20c8f74 --- /dev/null +++ b/org.eclipse.xtext.xtext.bootstrap/.classpath @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/org.eclipse.xtext.xtext.bootstrap/.project b/org.eclipse.xtext.xtext.bootstrap/.project new file mode 100644 index 000000000..771577e67 --- /dev/null +++ b/org.eclipse.xtext.xtext.bootstrap/.project @@ -0,0 +1,29 @@ + + + org.eclipse.xtext.xtext.bootstrap + Project org.eclipse.xtext.bootstrap created by Buildship. + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.xtext.ui.shared.xtextNature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/org.eclipse.xtext.xtext.bootstrap/BootstrapXtext.launch b/org.eclipse.xtext.xtext.bootstrap/BootstrapXtext.launch new file mode 100644 index 000000000..61a6a7cc9 --- /dev/null +++ b/org.eclipse.xtext.xtext.bootstrap/BootstrapXtext.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/org.eclipse.xtext.xtext.bootstrap/build.gradle b/org.eclipse.xtext.xtext.bootstrap/build.gradle new file mode 100644 index 000000000..8032daac7 --- /dev/null +++ b/org.eclipse.xtext.xtext.bootstrap/build.gradle @@ -0,0 +1,41 @@ +// re-configure the 'main' and 'mwe2' sourceSets as the content of this project's +// source folders need to be compiled before the generator execution +sourceSets { + main.java.srcDirs = [] + main.resources.srcDirs = [] + + // the 'mwe2' sourceSet is declared in '../gradle/java-compiler-settings.gradle' + mwe2.java.srcDirs = [ 'src', 'xtend-gen' ] +} + +dependencies { + // we cannot use the projects within the workspace, as we would have + // to compile them before generating the code, so we need to stick to the bootstrapping version + // buildship, however, links the workspace projects anyway (as yet) + mwe2Compile "org.eclipse.xtext:org.eclipse.xtext:$versions.xtext_bootstrap" + mwe2Compile "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:$versions.xtext_bootstrap" + + // dependencies required for successfully executing the Xtext generation workflow + mwe2Runtime "org.eclipse.emf:org.eclipse.emf.mwe2.launch:$versions.emfMwe2" + mwe2Runtime "org.eclipse.xtext:org.eclipse.xtext.common.types:$versions.xtext_bootstrap" + mwe2Runtime "org.eclipse.xtext:org.eclipse.xtext.ecore:$versions.xtext_bootstrap" +} + +/** + * Call this task for generating the 'Xtext' language implementation. + * The employed version of the Xtext generator is determined by '$versions.xtext_bootstrap', see above. + */ +task generateXtextLanguage(type: JavaExec) { + main = 'org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher' + + classpath = sourceSets.mwe2.runtimeClasspath + // includes mwe2Runtime+mwe2Compile dependencies + the classes obtained from sourceSets.mwe2.java.srcDirs + + args += "src/org/eclipse/xtext/xtext/bootstrap/GenerateXtext.mwe2" + args += "-p" + args += "rootPath=/${projectDir}/.." +} + +// the following setting would cause 'generateXtextLanguage' to be executed as part of 'build', +// namely before compiling the classes of the 'main' sourceSet, which however is empty here +// classes.dependsOn(generateXtextLanguage) \ No newline at end of file diff --git a/org.eclipse.xtext.xtext.bootstrap/src/org/eclipse/xtext/xtext/bootstrap/GenerateXtext.mwe2 b/org.eclipse.xtext.xtext.bootstrap/src/org/eclipse/xtext/xtext/bootstrap/GenerateXtext.mwe2 new file mode 100644 index 000000000..a0c8d3462 --- /dev/null +++ b/org.eclipse.xtext.xtext.bootstrap/src/org/eclipse/xtext/xtext/bootstrap/GenerateXtext.mwe2 @@ -0,0 +1,139 @@ +/******************************************************************************* + * Copyright (c) 2010 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 + *******************************************************************************/ +module org.eclipse.xtext.xtext.bootstrap.GenerateXtext + +import org.eclipse.emf.mwe.utils.* +import org.eclipse.xtext.xtext.generator.* +import org.eclipse.xtext.xtext.generator.model.project.* +import org.eclipse.xtext.generator.* +import org.eclipse.xtext.ui.generator.* +import org.eclipse.xtext.generator.parser.antlr.* +import org.eclipse.xtext.resource.XtextResourceSet + +var rootPath = ".." +var baseName = "org.eclipse.xtext" +var runtimeProjectName = baseName +var ideProjectName = "${baseName}.xtext.ide" +var eclipseProjectName = "${baseName}.xtext.ui" +var ideaProjectName = "${baseName}.xtext.idea" + +var fileHeader = "/*\n * generated by Xtext 2.11\n */" //\${version}\n */" + +var file.extensions = "xtext,xtext2" + +Workflow { + component = XtextGenerator { + configuration = DefaultGeneratorModule { + project = StandardProjectConfig { + baseName = baseName + rootPath = rootPath + + runtime = { + name = runtimeProjectName + } + } + code = { + encoding = "ISO-8859-1" + lineDelimiter = "\n" + fileHeader = fileHeader + preferXtendStubs = false + } + } + + language = { + name = "org.eclipse.xtext.common.Terminals" + + fragment = grammarAccess.GrammarAccessFragment2 {} + + fragment = serializer.SerializerFragment2 { + generateStub = false + } + } + } + + component = XtextGenerator { + configuration = XtextLangGeneratorModule { + project = StandardProjectConfig { + baseName = baseName + rootPath = rootPath + + runtime = { + name = runtimeProjectName + } + genericIde = { + enabled = true + name = ideProjectName + } + eclipsePlugin = { + enabled = true + name = eclipseProjectName + root = "${rootPath}/../xtext-eclipse/${eclipseProjectName}" + } + ideaPlugin = { + enabled = true + name = ideaProjectName + root = "${rootPath}/../xtext-idea/${ideaProjectName}" + } + // createEclipseMetaData = true + } + code = { + encoding = "ISO-8859-1" + lineDelimiter = "\n" + fileHeader = fileHeader + preferXtendStubs = false + } + } + + cleaner = { + // for the sake of keeping the artifacts generated above exclude everything in + // 'org.eclipse.xtext.common'; unfortunately the cleaner expects simple names so... + exclude = "common" + } + + language = { + name = "org.eclipse.xtext.Xtext" + fileExtensions = file.extensions + + referencedResource = "platform:/resource/org.eclipse.xtext/org/eclipse/xtext/Xtext.genmodel" + referencedResource = "platform:/resource/org.eclipse.xtext/org/eclipse/xtext/Xtext.ecore" + + fragment = grammarAccess.GrammarAccessFragment2 {} + + fragment = parser.antlr.XtextAntlrGeneratorFragment2 { + options = { + classSplitting = true + } + } + + fragment = ui.contentAssist.ContentAssistFragment2 {} + + fragment = ui.labeling.LabelProviderFragment2 {} + + fragment = resourceFactory.ResourceFactoryFragment2 {} + + fragment = serializer.SerializerFragment2 { + generateStub = false + } + + fragment = ui.compare.CompareFragment2 {} + + fragment = ui.refactoring.RefactorElementNameFragment2 {} + + fragment = ui.templates.CodetemplatesGeneratorFragment2 {} + + fragment = org.eclipse.xtext.xtext.generator.idea.IdeaPluginGenerator { + generateXtendStub = true + } + fragment = org.eclipse.xtext.xtext.generator.idea.parser.antlr.XtextAntlrIDEAGeneratorFragment { + options = { + classSplitting = true + } + } + } + } +} \ No newline at end of file diff --git a/org.eclipse.xtext.xtext.bootstrap/src/org/eclipse/xtext/xtext/bootstrap/XtextLangGeneratorModule.xtend b/org.eclipse.xtext.xtext.bootstrap/src/org/eclipse/xtext/xtext/bootstrap/XtextLangGeneratorModule.xtend new file mode 100644 index 000000000..3a861cce6 --- /dev/null +++ b/org.eclipse.xtext.xtext.bootstrap/src/org/eclipse/xtext/xtext/bootstrap/XtextLangGeneratorModule.xtend @@ -0,0 +1,40 @@ +package org.eclipse.xtext.xtext.bootstrap + +import org.eclipse.xtext.Grammar +import org.eclipse.xtext.xtext.generator.DefaultGeneratorModule +import org.eclipse.xtext.xtext.generator.XtextGeneratorNaming +import org.eclipse.xtext.xtext.generator.model.TypeReference + +class XtextLangGeneratorModule extends DefaultGeneratorModule { + + def Class bindNaming() { + return XtextLangGeneratorNaming + } + + public static class XtextLangGeneratorNaming extends XtextGeneratorNaming { + + override getGenericIdeBasePackage(Grammar grammar) { + if (isXtext(grammar)) { + return "org.eclipse.xtext.xtext.ide"; + } else { + return super.getGenericIdeBasePackage(grammar); + } + } + + override getEclipsePluginBasePackage(Grammar grammar) { + if (isXtext(grammar)) { + return "org.eclipse.xtext.xtext.ui"; + } else { + return super.getEclipsePluginBasePackage(grammar); + } + } + + override getEclipsePluginActivator() { + return new TypeReference("org.eclipse.xtext.xtext.ui.internal", "Activator"); + } + + def boolean isXtext(Grammar grammar) { + return grammar.getName().equals("org.eclipse.xtext.Xtext"); + } + } +} \ No newline at end of file diff --git a/org.eclipse.xtext.xtext.bootstrap/xtend-gen/org/eclipse/xtext/xtext/bootstrap/XtextLangGeneratorModule.java b/org.eclipse.xtext.xtext.bootstrap/xtend-gen/org/eclipse/xtext/xtext/bootstrap/XtextLangGeneratorModule.java new file mode 100644 index 000000000..ccdc5d82a --- /dev/null +++ b/org.eclipse.xtext.xtext.bootstrap/xtend-gen/org/eclipse/xtext/xtext/bootstrap/XtextLangGeneratorModule.java @@ -0,0 +1,45 @@ +package org.eclipse.xtext.xtext.bootstrap; + +import org.eclipse.xtext.Grammar; +import org.eclipse.xtext.xtext.generator.DefaultGeneratorModule; +import org.eclipse.xtext.xtext.generator.XtextGeneratorNaming; +import org.eclipse.xtext.xtext.generator.model.TypeReference; + +@SuppressWarnings("all") +public class XtextLangGeneratorModule extends DefaultGeneratorModule { + public static class XtextLangGeneratorNaming extends XtextGeneratorNaming { + @Override + public String getGenericIdeBasePackage(final Grammar grammar) { + boolean _isXtext = this.isXtext(grammar); + if (_isXtext) { + return "org.eclipse.xtext.xtext.ide"; + } else { + return super.getGenericIdeBasePackage(grammar); + } + } + + @Override + public String getEclipsePluginBasePackage(final Grammar grammar) { + boolean _isXtext = this.isXtext(grammar); + if (_isXtext) { + return "org.eclipse.xtext.xtext.ui"; + } else { + return super.getEclipsePluginBasePackage(grammar); + } + } + + @Override + public TypeReference getEclipsePluginActivator() { + return new TypeReference("org.eclipse.xtext.xtext.ui.internal", "Activator"); + } + + public boolean isXtext(final Grammar grammar) { + String _name = grammar.getName(); + return _name.equals("org.eclipse.xtext.Xtext"); + } + } + + public Class bindNaming() { + return XtextLangGeneratorModule.XtextLangGeneratorNaming.class; + } +} diff --git a/settings.gradle b/settings.gradle index 33e92b7ca..b19337d31 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,6 @@ rootProject.name = 'xtext-core' +include 'org.eclipse.xtext.xtext.bootstrap' include 'org.eclipse.xtext' include 'org.eclipse.xtext.ide' include 'org.eclipse.xtext.util'