diff --git a/.project b/.project index 259ea2655..1ace49604 100644 --- a/.project +++ b/.project @@ -5,11 +5,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/build.gradle b/build.gradle index c10883ee5..14385f4ad 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { apply from: "${rootDir}/gradle/versions.gradle" repositories.jcenter() dependencies { - classpath "org.xtext:xtext-gradle-plugin:$versions.xtend_plugin" + classpath "org.xtext:xtext-gradle-plugin:$versions.xtext_gradle_plugin" classpath "io.typefox.gradle:gradle-p2gen:$versions.gradle_plugins" } } @@ -35,7 +35,10 @@ subprojects { apply from: "${rootDir}/gradle/java-compiler-settings.gradle" apply from: "${rootDir}/gradle/xtend-compiler-settings.gradle" apply from: "${rootDir}/gradle/maven-deployment.gradle" - apply from: "${rootDir}/gradle/eclipse-project-layout.gradle" + // The bootstrap project uses only the mwe2 source set + if (!name.endsWith('bootstrap')) { + apply from: "${rootDir}/gradle/eclipse-project-layout.gradle" + } apply from: "${rootDir}/gradle/manifest-gen.gradle" apply from: "${rootDir}/gradle/validation.gradle" } diff --git a/gradle/bootstrap-setup.gradle b/gradle/bootstrap-setup.gradle index 410575373..daf065a94 100644 --- a/gradle/bootstrap-setup.gradle +++ b/gradle/bootstrap-setup.gradle @@ -32,5 +32,5 @@ configurations { dependencies { xtendCompiler "org.eclipse.xtend:org.eclipse.xtend.core:$bootstrapXtendVersion" xtendCompiler "org.eclipse.xtext:org.eclipse.xtext.smap:$bootstrapXtendVersion" - xtendCompiler "org.xtext:xtext-gradle-builder:$versions.xtend_plugin" + xtendCompiler "org.xtext:xtext-gradle-builder:$versions.xtext_gradle_plugin" } diff --git a/gradle/eclipse-project-layout.gradle b/gradle/eclipse-project-layout.gradle index aa629c037..ee158c801 100644 --- a/gradle/eclipse-project-layout.gradle +++ b/gradle/eclipse-project-layout.gradle @@ -32,14 +32,18 @@ jar { from ('.') { include 'about*.*', 'plugin.xml', 'schema/**', 'model/**', 'plugin.properties' } - if (isTestProject) - from(sourceSets.test.output) + if (isTestProject) { + from sourceSets.test.output + } } sourcesJar { from ('.') { include 'about*.*' } + if (isTestProject) { + from sourceSets.test.allSource + } } if (isTestProject || name.contains('testlanguage')) { @@ -56,7 +60,6 @@ if (isTestProject || name.contains('testlanguage')) { eclipse { classpath { plusConfigurations += [configurations.optional] - plusConfigurations += [configurations.mwe2Runtime] file.whenMerged { entries.each { source -> if (source.kind == 'src' && source.path.endsWith('-gen') && !source.path.equals('xtend-gen') ) { diff --git a/gradle/java-compiler-settings.gradle b/gradle/java-compiler-settings.gradle index 33017bcea..4e3759004 100644 --- a/gradle/java-compiler-settings.gradle +++ b/gradle/java-compiler-settings.gradle @@ -32,17 +32,11 @@ task javadocJar(type: Jar, dependsOn: javadoc) { from javadoc.destinationDir } -sourceSets { - mwe2 {} -} - configurations { optional { description 'Dependencies required at build time, but not exported into meta data' extendsFrom compile } - mwe2Compile.extendsFrom mainCompile - mwe2Runtime.extendsFrom mainRuntime // Put any unwanted transitive dependencies here, they will be excluded from all projects. all { diff --git a/gradle/mwe2-workflows.gradle b/gradle/mwe2-workflows.gradle new file mode 100644 index 000000000..d9748661e --- /dev/null +++ b/gradle/mwe2-workflows.gradle @@ -0,0 +1,37 @@ +/* + * Configuration of source sets, dependencies, and tasks for running MWE2 workflows. + */ + +sourceSets { + mwe2 {} +} + +eclipse.classpath.plusConfigurations += [configurations.mwe2Runtime] + +dependencies { + if (!name.endsWith('bootstrap')) { + mwe2Compile project(':org.eclipse.xtext.xtext.generator') + } + 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" +} + +if (findProperty('compileXtend') == 'true') { + generateMwe2Xtext.xtextClasspath = rootProject.configurations.getByName('xtendCompiler') +} + +class XtextGeneratorTask extends JavaExec { + XtextGeneratorTask() { + group = 'Build' + main = 'org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher' + classpath = project.sourceSets.mwe2.runtimeClasspath + } + def setWorkflow(File workflowFile) { + args = [workflowFile.path, "-p", "rootPath=${project.rootDir}"] + inputs.file workflowFile + description "Execute the MWE2 workflow ${workflowFile.name}" + } +} + +ext.XtextGeneratorTask = XtextGeneratorTask diff --git a/gradle/versions.gradle b/gradle/versions.gradle index 5a8616844..7a72dc0b5 100644 --- a/gradle/versions.gradle +++ b/gradle/versions.gradle @@ -8,7 +8,7 @@ ext.versions = [ 'xtext': version, 'xtext_bootstrap': '2.11.0.beta2', 'gradle_plugins': '0.1.0', - 'xtend_plugin': '1.0.14', + 'xtext_gradle_plugin': '1.0.15', 'lsp4j': '0.1.0-SNAPSHOT', 'log4j': '1.2.16', 'equinoxCommon' : '3.8.0', diff --git a/gradle/xtend-compiler-settings.gradle b/gradle/xtend-compiler-settings.gradle index 37a199a3d..37256421f 100644 --- a/gradle/xtend-compiler-settings.gradle +++ b/gradle/xtend-compiler-settings.gradle @@ -7,14 +7,17 @@ if (findProperty('compileXtend') == 'true') { gen.xtextClasspath = rootProject.configurations.getByName('xtendCompiler') } - sourcesJar { - from (sourceSets.main.xtendOutputDir) { - include '**/*._trace' - } - if (name.endsWith('tests')) { - from (sourceSets.test.xtendOutputDir) { + // Defer the sources jar configuration to later when the source sets are set up completely + afterEvaluate { + sourcesJar { + from (sourceSets.main.xtendOutputDir) { include '**/*._trace' } + if (name.endsWith('tests')) { + from (sourceSets.test.xtendOutputDir) { + include '**/*._trace' + } + } } } } diff --git a/org.eclipse.xtext.ide.tests/.classpath b/org.eclipse.xtext.ide.tests/.classpath index 15bdd0fa1..0043d86df 100644 --- a/org.eclipse.xtext.ide.tests/.classpath +++ b/org.eclipse.xtext.ide.tests/.classpath @@ -1,24 +1,11 @@ - - - - - - - - - - - - - - - + + + - diff --git a/org.eclipse.xtext.ide.tests/.project b/org.eclipse.xtext.ide.tests/.project index 189d0c567..b63881c1c 100644 --- a/org.eclipse.xtext.ide.tests/.project +++ b/org.eclipse.xtext.ide.tests/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext.ide.tests/build.gradle b/org.eclipse.xtext.ide.tests/build.gradle index 0ee4a6034..0b351bcf5 100644 --- a/org.eclipse.xtext.ide.tests/build.gradle +++ b/org.eclipse.xtext.ide.tests/build.gradle @@ -1,3 +1,5 @@ +apply from: "${rootDir}/gradle/mwe2-workflows.gradle" + dependencies { compile project(':org.eclipse.xtext.ide') compile project(':org.eclipse.xtext.testing') @@ -5,20 +7,6 @@ dependencies { compile project(':org.eclipse.xtext.testlanguages.ide') compile "junit:junit:$versions.junit" compile "org.eclipse.lsp4j:org.eclipse.lsp4j:$versions.lsp4j" - mwe2Compile project(':org.eclipse.xtext.xtext.generator') - mwe2Compile "org.eclipse.xtext:org.eclipse.xtext.common.types:$versions.xtext_bootstrap" - mwe2Runtime "org.eclipse.emf:org.eclipse.emf.mwe2.launch:$versions.emfMwe2" -} - -task generateXtextLanguage(type: JavaExec) { - main = 'org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher' - classpath = configurations.mwe2Runtime - inputs.file "testlang-src/org/eclipse/xtext/ide/tests/testlanguage/GenerateTestLanguage.mwe2" - inputs.file "testlang-src/org/eclipse/xtext/ide/tests/testlanguage/TestLanguage.xtext" - outputs.dir "testlang-src-gen" - args += "testlang-src/org/eclipse/xtext/ide/tests/testlanguage/GenerateTestLanguage.mwe2" - args += "-p" - args += "rootPath=/${projectDir}/.." } sourceSets.test.java { @@ -29,3 +17,9 @@ sourceSets.test.resources { srcDir 'testlang-src' srcDir 'testlang-src-gen' } + +task generateTestLanguages(type: XtextGeneratorTask) { + workflow = file('testlang-src/org/eclipse/xtext/ide/tests/testlanguage/GenerateTestLanguage.mwe2') + inputs.file 'testlang-src/org/eclipse/xtext/ide/tests/testlanguage/TestLanguage.xtext' + outputs.dir 'testlang-src-gen' +} diff --git a/org.eclipse.xtext.ide.tests/model/generated/PartialContentAssistTestLanguage.genmodel b/org.eclipse.xtext.ide.tests/model/generated/PartialContentAssistTestLanguage.genmodel index 439677fc0..3d0dea5cd 100644 --- a/org.eclipse.xtext.ide.tests/model/generated/PartialContentAssistTestLanguage.genmodel +++ b/org.eclipse.xtext.ide.tests/model/generated/PartialContentAssistTestLanguage.genmodel @@ -4,7 +4,7 @@ modelDirectory="/org.eclipse.xtext.ide.tests/testlang-src-gen" modelPluginID="org.eclipse.xtext.ide.tests" forceOverwrite="true" modelName="PartialContentAssistTestLanguage" updateClasspath="false" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container" complianceLevel="6.0" - copyrightFields="false" runtimeVersion="2.11"> + copyrightFields="false" runtimeVersion="2.12"> diff --git a/org.eclipse.xtext.ide.tests/model/generated/TestLanguage.genmodel b/org.eclipse.xtext.ide.tests/model/generated/TestLanguage.genmodel index 00e266c31..70d0bf6a9 100644 --- a/org.eclipse.xtext.ide.tests/model/generated/TestLanguage.genmodel +++ b/org.eclipse.xtext.ide.tests/model/generated/TestLanguage.genmodel @@ -3,7 +3,7 @@ xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) 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" modelDirectory="/org.eclipse.xtext.ide.tests/testlang-src-gen" modelPluginID="org.eclipse.xtext.ide.tests" forceOverwrite="true" modelName="TestLanguage" updateClasspath="false" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container" - complianceLevel="6.0" copyrightFields="false" runtimeVersion="2.11"> + complianceLevel="6.0" copyrightFields="false" runtimeVersion="2.12"> diff --git a/org.eclipse.xtext.ide/.classpath b/org.eclipse.xtext.ide/.classpath index 2c86cbae2..ff4de9542 100644 --- a/org.eclipse.xtext.ide/.classpath +++ b/org.eclipse.xtext.ide/.classpath @@ -1,15 +1,7 @@ - - - - - - - - - - + + diff --git a/org.eclipse.xtext.ide/.project b/org.eclipse.xtext.ide/.project index 19a65ecb5..1d9b1562e 100644 --- a/org.eclipse.xtext.ide/.project +++ b/org.eclipse.xtext.ide/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/ProjectManager.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/ProjectManager.xtend index b97107271..f1823fe1b 100644 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/ProjectManager.xtend +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/ProjectManager.xtend @@ -115,7 +115,10 @@ class ProjectManager { } def Resource getResource(URI uri) { - resourceSet.getResource(uri, true) + val resource = resourceSet.getResource(uri, true) + // initialize + resource.contents + return resource } def void reportProjectIssue(String message, String code, Severity severity) { diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/ProjectManager.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/ProjectManager.java index aa328c915..870c21351 100644 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/ProjectManager.java +++ b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/ProjectManager.java @@ -152,7 +152,9 @@ public class ProjectManager { } public Resource getResource(final URI uri) { - return this.resourceSet.getResource(uri, true); + final Resource resource = this.resourceSet.getResource(uri, true); + resource.getContents(); + return resource; } public void reportProjectIssue(final String message, final String code, final Severity severity) { diff --git a/org.eclipse.xtext.testing/.classpath b/org.eclipse.xtext.testing/.classpath index 8ab566493..e044adede 100644 --- a/org.eclipse.xtext.testing/.classpath +++ b/org.eclipse.xtext.testing/.classpath @@ -1,20 +1,8 @@ - - - - - - - - - - - - - - - + + + diff --git a/org.eclipse.xtext.testing/.project b/org.eclipse.xtext.testing/.project index c3ecece48..f86f2856b 100644 --- a/org.eclipse.xtext.testing/.project +++ b/org.eclipse.xtext.testing/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext.testing/src/org/eclipse/xtext/testing/formatter/FormatterTestHelper.java b/org.eclipse.xtext.testing/src/org/eclipse/xtext/testing/formatter/FormatterTestHelper.java index 31093c52d..7d9689333 100644 --- a/org.eclipse.xtext.testing/src/org/eclipse/xtext/testing/formatter/FormatterTestHelper.java +++ b/org.eclipse.xtext.testing/src/org/eclipse/xtext/testing/formatter/FormatterTestHelper.java @@ -92,10 +92,14 @@ public class FormatterTestHelper { String document = req.getToBeFormatted().toString(); XtextResource parsed = parse(document); if (req.isAllowSyntaxErrors()) { - request.setExceptionHandler(ExceptionAcceptor.IGNORING); + if (request.getExplicitExceptionHandler() == null) { + request.setExceptionHandler(ExceptionAcceptor.IGNORING); + } } else { assertNoSyntaxErrors(parsed); - request.setExceptionHandler(ExceptionAcceptor.THROWING); + if (request.getExplicitExceptionHandler() == null) { + request.setExceptionHandler(ExceptionAcceptor.THROWING); + } } request.setTextRegionAccess(createRegionAccess(parsed, req)); if (request.getPreferences() == null) diff --git a/org.eclipse.xtext.testlanguages.ide/.classpath b/org.eclipse.xtext.testlanguages.ide/.classpath index 61b3660a4..6911d19cd 100644 --- a/org.eclipse.xtext.testlanguages.ide/.classpath +++ b/org.eclipse.xtext.testlanguages.ide/.classpath @@ -1,14 +1,9 @@ - - - - - + - diff --git a/org.eclipse.xtext.testlanguages.ide/.project b/org.eclipse.xtext.testlanguages.ide/.project index 175d535a2..5fb7de12c 100644 --- a/org.eclipse.xtext.testlanguages.ide/.project +++ b/org.eclipse.xtext.testlanguages.ide/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext.testlanguages/.classpath b/org.eclipse.xtext.testlanguages/.classpath index 95bc5ae57..f10cbac4b 100644 --- a/org.eclipse.xtext.testlanguages/.classpath +++ b/org.eclipse.xtext.testlanguages/.classpath @@ -1,19 +1,10 @@ - - - - - - - - - - + + - diff --git a/org.eclipse.xtext.testlanguages/.project b/org.eclipse.xtext.testlanguages/.project index 8ea51f710..3f909b41e 100644 --- a/org.eclipse.xtext.testlanguages/.project +++ b/org.eclipse.xtext.testlanguages/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext.testlanguages/build.gradle b/org.eclipse.xtext.testlanguages/build.gradle index 21b8942cb..8aad6e55b 100644 --- a/org.eclipse.xtext.testlanguages/build.gradle +++ b/org.eclipse.xtext.testlanguages/build.gradle @@ -1,10 +1,15 @@ +apply from: "${rootDir}/gradle/mwe2-workflows.gradle" + dependencies { compile project(':org.eclipse.xtext') compile project(':org.eclipse.xtext.testing') compile "org.eclipse.platform:org.eclipse.core.runtime:$versions.eclipseCore" - mwe2Compile project(':org.eclipse.xtext.xtext.generator') - mwe2Runtime "org.eclipse.xtext:org.eclipse.xtext.common.types:$versions.xtext_bootstrap" - mwe2Runtime "org.eclipse.emf:org.eclipse.emf.mwe2.launch:$versions.emfMwe2" } -uploadArchives.enabled = false +// Include the mwe2 and xtext files from the main source set when executing the workflow +sourceSets.mwe2.runtimeClasspath += processResources.outputs.files + +task generateTestLanguages(type: XtextGeneratorTask) { + workflow = file('src/org/eclipse/xtext/testlanguages/GenerateTestLanguages.mwe2') + outputs.dir 'src-gen' +} diff --git a/org.eclipse.xtext.tests/.classpath b/org.eclipse.xtext.tests/.classpath index 76839ce42..b62832fcf 100644 --- a/org.eclipse.xtext.tests/.classpath +++ b/org.eclipse.xtext.tests/.classpath @@ -1,41 +1,22 @@ - - - - - - - - - - + + - - - - - - - - - - - - + + - diff --git a/org.eclipse.xtext.tests/.project b/org.eclipse.xtext.tests/.project index f42e37da1..08876e895 100644 --- a/org.eclipse.xtext.tests/.project +++ b/org.eclipse.xtext.tests/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext.tests/build.gradle b/org.eclipse.xtext.tests/build.gradle index 252ce7ae6..b8576c55a 100644 --- a/org.eclipse.xtext.tests/build.gradle +++ b/org.eclipse.xtext.tests/build.gradle @@ -1,8 +1,4 @@ -repositories { - flatDir { - dirs 'lib' - } -} +apply from: "${rootDir}/gradle/mwe2-workflows.gradle" dependencies { compile project(':org.eclipse.xtext.testing') @@ -12,19 +8,33 @@ dependencies { compile "junit:junit:$versions.junit" compile "org.eclipse.emf:org.eclipse.emf.common:$versions.emfCommon" compile "org.eclipse.emf:org.eclipse.emf.ecore.xmi:$versions.emfEcore" - // From the 'lib' folder - optional name: 'simple' - mwe2Runtime "org.eclipse.xtext:org.eclipse.xtext.common.types:$versions.xtext_bootstrap" - mwe2Runtime "org.eclipse.emf:org.eclipse.emf.mwe2.launch:$versions.emfMwe2" + optional files('lib/simple.jar') + // The MWE2 workflow depends on emf-gen, so we have to include it in the test dependencies + testCompile sourceSets.mwe2.output } -sourceSets.test.java { - srcDir 'suites' +sourceSets.test { + java.srcDirs = ['src', 'src-gen', 'suites'] + if (findProperty('compileXtend') != 'true') { + java.srcDir 'xtend-gen' + } } -sourceSets.mwe2.java { - srcDir 'generator/src' - srcDir 'generator/xtend-gen' +sourceSets.mwe2 { + java.srcDirs = ['generator/src', 'emf-gen'] + if (findProperty('compileXtend') == 'true') { + xtendOutputDir = 'generator/xtend-gen' + } else { + java.srcDir 'generator/xtend-gen' + } + runtimeClasspath += processTestResources.outputs.files +} +jar.from sourceSets.mwe2.output +sourcesJar.from sourceSets.mwe2.allSource + +task generateTestLanguages(type: XtextGeneratorTask) { + workflow = file('src/org/eclipse/xtext/GenerateAllTestLanguages.mwe2') + outputs.dir 'src-gen' } test { diff --git a/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerNsURI/impl/EcorePerNsURIPackageImpl.java b/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerNsURI/impl/EcorePerNsURIPackageImpl.java index 2e976d05b..33fa4cbe7 100644 --- a/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerNsURI/impl/EcorePerNsURIPackageImpl.java +++ b/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerNsURI/impl/EcorePerNsURIPackageImpl.java @@ -11,25 +11,15 @@ import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EcorePackage; - import org.eclipse.emf.ecore.impl.EPackageImpl; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerNsURI.EcorePerNsURIFactory; import org.eclipse.xtext.metamodelreferencing.tests.ecorePerNsURI.EcorePerNsURIPackage; import org.eclipse.xtext.metamodelreferencing.tests.ecorePerNsURI.ExtendsNsURIEObject; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformPlugin.EcorePerPlatformPluginPackage; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformPlugin.impl.EcorePerPlatformPluginPackageImpl; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformResource.EcorePerPlatformResourcePackage; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformResource.impl.EcorePerPlatformResourcePackageImpl; -import org.eclipse.xtext.metamodelreferencing.tests.ecoreReference.EcoreReferencePackage; - -import org.eclipse.xtext.metamodelreferencing.tests.ecoreReference.impl.EcoreReferencePackageImpl; - /** * * An implementation of the model Package. diff --git a/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerPlatformPlugin/impl/EcorePerPlatformPluginPackageImpl.java b/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerPlatformPlugin/impl/EcorePerPlatformPluginPackageImpl.java index 48a639062..621e333b3 100644 --- a/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerPlatformPlugin/impl/EcorePerPlatformPluginPackageImpl.java +++ b/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerPlatformPlugin/impl/EcorePerPlatformPluginPackageImpl.java @@ -11,26 +11,16 @@ import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EcorePackage; - import org.eclipse.emf.ecore.impl.EPackageImpl; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerNsURI.EcorePerNsURIPackage; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerNsURI.impl.EcorePerNsURIPackageImpl; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformPlugin.EcorePerPlatformPluginFactory; import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformPlugin.EcorePerPlatformPluginPackage; import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformPlugin.ExtendsEAttribute; import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformPlugin.ExtendsPluginEObject; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformResource.EcorePerPlatformResourcePackage; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformResource.impl.EcorePerPlatformResourcePackageImpl; -import org.eclipse.xtext.metamodelreferencing.tests.ecoreReference.EcoreReferencePackage; - -import org.eclipse.xtext.metamodelreferencing.tests.ecoreReference.impl.EcoreReferencePackageImpl; - /** * * An implementation of the model Package. diff --git a/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerPlatformResource/impl/EcorePerPlatformResourcePackageImpl.java b/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerPlatformResource/impl/EcorePerPlatformResourcePackageImpl.java index 186c6609e..729f4ee30 100644 --- a/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerPlatformResource/impl/EcorePerPlatformResourcePackageImpl.java +++ b/org.eclipse.xtext.tests/emf-gen/org/eclipse/xtext/metamodelreferencing/tests/ecorePerPlatformResource/impl/EcorePerPlatformResourcePackageImpl.java @@ -11,25 +11,15 @@ import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EcorePackage; - import org.eclipse.emf.ecore.impl.EPackageImpl; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerNsURI.EcorePerNsURIPackage; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerNsURI.impl.EcorePerNsURIPackageImpl; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformPlugin.EcorePerPlatformPluginPackage; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformPlugin.impl.EcorePerPlatformPluginPackageImpl; - import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformResource.EcorePerPlatformResourceFactory; import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformResource.EcorePerPlatformResourcePackage; import org.eclipse.xtext.metamodelreferencing.tests.ecorePerPlatformResource.ExtendsResourceEObject; -import org.eclipse.xtext.metamodelreferencing.tests.ecoreReference.EcoreReferencePackage; - -import org.eclipse.xtext.metamodelreferencing.tests.ecoreReference.impl.EcoreReferencePackageImpl; - /** * * An implementation of the model Package. diff --git a/org.eclipse.xtext.tests/plugin.xml b/org.eclipse.xtext.tests/plugin.xml index b8b1de6f6..11bad6eed 100755 --- a/org.eclipse.xtext.tests/plugin.xml +++ b/org.eclipse.xtext.tests/plugin.xml @@ -886,4 +886,27 @@ class="org.eclipse.xtext.generator.ecore.genmodelaccess.noLiterals.NoLiteralsPackage" genModel="src/org/eclipse/xtext/generator/ecore/GenModelAccessTest.genmodel"/> + + + + + + + + + + + + + + diff --git a/org.eclipse.xtext.tests/src-gen/org/eclipse/xtext/parser/unorderedGroups/serializer/ExUnorderedGroupsTestLanguageSyntacticSequencer.java b/org.eclipse.xtext.tests/src-gen/org/eclipse/xtext/parser/unorderedGroups/serializer/ExUnorderedGroupsTestLanguageSyntacticSequencer.java index 314f9f85a..31df2745c 100644 --- a/org.eclipse.xtext.tests/src-gen/org/eclipse/xtext/parser/unorderedGroups/serializer/ExUnorderedGroupsTestLanguageSyntacticSequencer.java +++ b/org.eclipse.xtext.tests/src-gen/org/eclipse/xtext/parser/unorderedGroups/serializer/ExUnorderedGroupsTestLanguageSyntacticSequencer.java @@ -62,14 +62,14 @@ public class ExUnorderedGroupsTestLanguageSyntacticSequencer extends AbstractSyn /** * Ambiguous syntax: * ( - * '5' | - * '6' | * '3' | - * '11' | - * '7' | - * '4' | * '10' | - * 'bug302585' + * 'bug302585' | + * '4' | + * '6' | + * '5' | + * '11' | + * '7' * ) * * This ambiguous syntax occurs at: diff --git a/org.eclipse.xtext.tests/src-gen/org/eclipse/xtext/parser/unorderedGroups/serializer/SimpleUnorderedGroupsTestLanguageSyntacticSequencer.java b/org.eclipse.xtext.tests/src-gen/org/eclipse/xtext/parser/unorderedGroups/serializer/SimpleUnorderedGroupsTestLanguageSyntacticSequencer.java index 54a266491..a75c5c104 100644 --- a/org.eclipse.xtext.tests/src-gen/org/eclipse/xtext/parser/unorderedGroups/serializer/SimpleUnorderedGroupsTestLanguageSyntacticSequencer.java +++ b/org.eclipse.xtext.tests/src-gen/org/eclipse/xtext/parser/unorderedGroups/serializer/SimpleUnorderedGroupsTestLanguageSyntacticSequencer.java @@ -63,13 +63,13 @@ public class SimpleUnorderedGroupsTestLanguageSyntacticSequencer extends Abstrac * Ambiguous syntax: * ( * '3' | - * '5' | - * '11' | - * '4' | - * '10' | - * 'bug302585' | * '6' | - * '7' + * '10' | + * '7' | + * '4' | + * '5' | + * 'bug302585' | + * '11' * ) * * This ambiguous syntax occurs at: diff --git a/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/internal/FormattingConflictTest.xtend b/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/internal/FormattingConflictTest.xtend new file mode 100644 index 000000000..5718019d0 --- /dev/null +++ b/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/internal/FormattingConflictTest.xtend @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2017 TypeFox GmbH (http://www.typefox.io) 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.formatting2.internal + +import com.google.inject.Inject +import org.eclipse.xtext.formatting2.internal.formattertestlanguage.IDList +import org.eclipse.xtext.formatting2.internal.tests.FormatterTestLanguageInjectorProvider +import org.eclipse.xtext.testing.InjectWith +import org.eclipse.xtext.testing.XtextRunner +import org.eclipse.xtext.util.Wrapper +import org.junit.Assert +import org.junit.Test +import org.junit.runner.RunWith + +/** + * @author Moritz Eysholdt - Initial contribution and API + */ +@RunWith(XtextRunner) +@InjectWith(FormatterTestLanguageInjectorProvider) +class FormattingConflictTest { + @Inject extension GenericFormatterTester + + // @Inject extension FormatterTestLanguageGrammarAccess + @Test def void enableDebugTracingTrue() { + val wrapper = new Wrapper + val execution = new Wrapper(0) + assertFormatted[ + toBeFormatted = ''' + idlist a + ''' + formatter = [ IDList model, extension regions, extension document | + execution.set(execution.get + 1) + model.regionFor.keyword("idlist").append[space = " "] + model.regionFor.keyword("idlist").append[space = "\t"] + ] + request.enableDebugTracing = true + request.exceptionHandler = [ e | + wrapper.set(e) + ] + ] + val exception = wrapper.get as ConflictingRegionsException + Assert.assertEquals(1, execution.get) + Assert.assertEquals(2, exception.traces.size) + } + + @Test def void enableDebugTracingFalse() { + val wrapper = new Wrapper + val execution = new Wrapper(0) + assertFormatted[ + toBeFormatted = ''' + idlist a + ''' + formatter = [ IDList model, extension regions, extension document | + execution.set(execution.get + 1) + model.regionFor.keyword("idlist").append[space = " "] + model.regionFor.keyword("idlist").append[space = "\t"] + ] + request.enableDebugTracing = false + request.exceptionHandler = [ e | + wrapper.set(e) + ] + ] + val exception = wrapper.get as ConflictingRegionsException + Assert.assertEquals(2, execution.get) + Assert.assertEquals(2, exception.traces.size) + } + +} diff --git a/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/internal/RegionSetTest.xtend b/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/internal/RegionSetTest.xtend index b99c42f07..29fd0407e 100644 --- a/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/internal/RegionSetTest.xtend +++ b/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/internal/RegionSetTest.xtend @@ -22,7 +22,7 @@ import static org.junit.Assert.* class RegionSetTest { def private void test(CharSequence expectation, (TestableTextSegmentSet)=>void test) { - val set = new TestableTextSegmentSet(new ArrayListTextSegmentSet(Functions.identity, Functions.toStringFunction)) + val set = new TestableTextSegmentSet(new ArrayListTextSegmentSet(Functions.identity, Functions.toStringFunction, true)) try { test.apply(set) } catch (Throwable t) { diff --git a/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/regionaccess/internal/RegionAccessBuilderTest.xtend b/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/regionaccess/internal/RegionAccessBuilderTest.xtend index dd0030014..202fa916a 100644 --- a/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/regionaccess/internal/RegionAccessBuilderTest.xtend +++ b/org.eclipse.xtext.tests/src/org/eclipse/xtext/formatting2/regionaccess/internal/RegionAccessBuilderTest.xtend @@ -23,6 +23,10 @@ import org.eclipse.xtext.testing.validation.ValidationTestHelper import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith +import org.eclipse.xtext.formatting2.regionaccess.ITextRegionAccess +import org.eclipse.xtext.formatting2.regionaccess.IHiddenRegion +import org.eclipse.xtext.formatting2.regionaccess.ISequentialRegion +import org.eclipse.xtext.formatting2.regionaccess.ISemanticRegion /** * @author Moritz Eysholdt - Initial contribution and API @@ -661,10 +665,28 @@ class RegionAccessBuilderTest { validationTestHelper.assertNoErrors(obj) val access1 = obj.createFromNodeModel val access2 = obj.serializeToRegions + assertToStringDoesNotCrash(access1) + assertToStringDoesNotCrash(access2) Assert.assertEquals(exp, new TextRegionAccessToString().withRegionAccess(access1).cfg() + "\n") Assert.assertEquals(exp, new TextRegionAccessToString().withRegionAccess(access2).cfg() + "\n") } + private def assertToStringDoesNotCrash(ITextRegionAccess access) { + var current = access.regionForRootEObject.previousHiddenRegion as ISequentialRegion + while (current !== null) { + Assert.assertNotNull(current.toString) + switch current { + IHiddenRegion: { + current = current.nextSemanticRegion + } + ISemanticRegion: { + Assert.assertNotNull(current.EObjectRegion.toString) + current = current.nextHiddenRegion + } + } + } + } + private def TextRegionAccessToString cfg(TextRegionAccessToString toStr) { toStr.hideColumnExplanation().withTextWidth(10) } diff --git a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/build.gradle b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/build.gradle index 12f4185df..458a2bf8a 100644 --- a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/build.gradle +++ b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/build.gradle @@ -12,6 +12,7 @@ dependencies { mwe2 "org.eclipse.emf:org.eclipse.emf.mwe2.launch:2.9.0.201605261059" mwe2 "org.eclipse.xtext:org.eclipse.xtext.common.types:${xtextVersion}" mwe2 "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}" + mwe2 "org.eclipse.xtext:xtext-antlr-generator:[2.1.1, 3)" } task generateXtextLanguage(type: JavaExec) { diff --git a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/pom.xml b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/pom.xml index 5d92422c5..2be6cb07a 100644 --- a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/pom.xml +++ b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.full/org.xtext.example.full.parent/org.xtext.example.full/pom.xml @@ -56,6 +56,11 @@ org.eclipse.xtext.xbase ${xtextVersion} + + org.eclipse.xtext + xtext-antlr-generator + [2.1.1, 3) + diff --git a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/build.gradle b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/build.gradle index 07e85a8da..3a3c4bcff 100644 --- a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/build.gradle +++ b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.gradle/org.xtext.example.gradle.parent/org.xtext.example.gradle/build.gradle @@ -15,6 +15,7 @@ dependencies { mwe2 "org.eclipse.emf:org.eclipse.emf.mwe2.launch:2.9.0.201605261059" mwe2 "org.eclipse.xtext:org.eclipse.xtext.common.types:${xtextVersion}" mwe2 "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}" + mwe2 "org.eclipse.xtext:xtext-antlr-generator:[2.1.1, 3)" } task generateXtextLanguage(type: JavaExec) { diff --git a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/pom.xml b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/pom.xml index 69b3e4aff..5e595bfbd 100644 --- a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/pom.xml +++ b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTycho/org.xtext.example.mavenTycho.parent/org.xtext.example.mavenTycho/pom.xml @@ -56,6 +56,11 @@ org.eclipse.xtext.xbase ${xtextVersion} + + org.eclipse.xtext + xtext-antlr-generator + [2.1.1, 3) + diff --git a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTychoP2/org.xtext.example.mavenTychoP2.parent/org.xtext.example.mavenTychoP2/pom.xml b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTychoP2/org.xtext.example.mavenTychoP2.parent/org.xtext.example.mavenTychoP2/pom.xml index 5ec3a02f2..098f5fd15 100644 --- a/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTychoP2/org.xtext.example.mavenTychoP2.parent/org.xtext.example.mavenTychoP2/pom.xml +++ b/org.eclipse.xtext.tests/testdata/wizard-expectations/org.xtext.example.mavenTychoP2/org.xtext.example.mavenTychoP2.parent/org.xtext.example.mavenTychoP2/pom.xml @@ -56,6 +56,11 @@ org.eclipse.xtext.xbase ${xtextVersion} + + org.eclipse.xtext + xtext-antlr-generator + [2.1.1, 3) + diff --git a/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/internal/FormattingConflictTest.java b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/internal/FormattingConflictTest.java new file mode 100644 index 000000000..b1d6a5c86 --- /dev/null +++ b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/internal/FormattingConflictTest.java @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2017 TypeFox GmbH (http://www.typefox.io) 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.formatting2.internal; + +import com.google.inject.Inject; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.formatting2.FormatterRequest; +import org.eclipse.xtext.formatting2.IFormattableDocument; +import org.eclipse.xtext.formatting2.IHiddenRegionFormatter; +import org.eclipse.xtext.formatting2.internal.ConflictingRegionsException; +import org.eclipse.xtext.formatting2.internal.GenericFormatter; +import org.eclipse.xtext.formatting2.internal.GenericFormatterTestRequest; +import org.eclipse.xtext.formatting2.internal.GenericFormatterTester; +import org.eclipse.xtext.formatting2.internal.formattertestlanguage.IDList; +import org.eclipse.xtext.formatting2.internal.tests.FormatterTestLanguageInjectorProvider; +import org.eclipse.xtext.formatting2.regionaccess.ITextRegionExtensions; +import org.eclipse.xtext.testing.InjectWith; +import org.eclipse.xtext.testing.XtextRunner; +import org.eclipse.xtext.util.IAcceptor; +import org.eclipse.xtext.util.Wrapper; +import org.eclipse.xtext.xbase.lib.Extension; +import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * @author Moritz Eysholdt - Initial contribution and API + */ +@RunWith(XtextRunner.class) +@InjectWith(FormatterTestLanguageInjectorProvider.class) +@SuppressWarnings("all") +public class FormattingConflictTest { + @Inject + @Extension + private GenericFormatterTester _genericFormatterTester; + + @Test + public void enableDebugTracingTrue() { + final Wrapper wrapper = new Wrapper(); + final Wrapper execution = new Wrapper(Integer.valueOf(0)); + final Procedure1 _function = (GenericFormatterTestRequest it) -> { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("idlist a"); + _builder.newLine(); + it.setToBeFormatted(_builder); + final GenericFormatter _function_1 = new GenericFormatter() { + @Override + protected void format(final IDList model, @Extension final ITextRegionExtensions regions, @Extension final IFormattableDocument document) { + Integer _get = execution.get(); + int _plus = ((_get).intValue() + 1); + execution.set(Integer.valueOf(_plus)); + final Procedure1 _function = (IHiddenRegionFormatter it_1) -> { + it_1.setSpace(" "); + }; + document.append(regions.regionFor(model).keyword("idlist"), _function); + final Procedure1 _function_1 = (IHiddenRegionFormatter it_1) -> { + it_1.setSpace("\t"); + }; + document.append(regions.regionFor(model).keyword("idlist"), _function_1); + } + }; + it.setFormatter(_function_1); + FormatterRequest _request = it.getRequest(); + _request.setEnableDebugTracing(true); + FormatterRequest _request_1 = it.getRequest(); + final IAcceptor _function_2 = (Exception e) -> { + wrapper.set(e); + }; + _request_1.setExceptionHandler(_function_2); + }; + this._genericFormatterTester.assertFormatted(_function); + Throwable _get = wrapper.get(); + final ConflictingRegionsException exception = ((ConflictingRegionsException) _get); + Assert.assertEquals(1, (execution.get()).intValue()); + Assert.assertEquals(2, exception.getTraces().size()); + } + + @Test + public void enableDebugTracingFalse() { + final Wrapper wrapper = new Wrapper(); + final Wrapper execution = new Wrapper(Integer.valueOf(0)); + final Procedure1 _function = (GenericFormatterTestRequest it) -> { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("idlist a"); + _builder.newLine(); + it.setToBeFormatted(_builder); + final GenericFormatter _function_1 = new GenericFormatter() { + @Override + protected void format(final IDList model, @Extension final ITextRegionExtensions regions, @Extension final IFormattableDocument document) { + Integer _get = execution.get(); + int _plus = ((_get).intValue() + 1); + execution.set(Integer.valueOf(_plus)); + final Procedure1 _function = (IHiddenRegionFormatter it_1) -> { + it_1.setSpace(" "); + }; + document.append(regions.regionFor(model).keyword("idlist"), _function); + final Procedure1 _function_1 = (IHiddenRegionFormatter it_1) -> { + it_1.setSpace("\t"); + }; + document.append(regions.regionFor(model).keyword("idlist"), _function_1); + } + }; + it.setFormatter(_function_1); + FormatterRequest _request = it.getRequest(); + _request.setEnableDebugTracing(false); + FormatterRequest _request_1 = it.getRequest(); + final IAcceptor _function_2 = (Exception e) -> { + wrapper.set(e); + }; + _request_1.setExceptionHandler(_function_2); + }; + this._genericFormatterTester.assertFormatted(_function); + Throwable _get = wrapper.get(); + final ConflictingRegionsException exception = ((ConflictingRegionsException) _get); + Assert.assertEquals(2, (execution.get()).intValue()); + Assert.assertEquals(2, exception.getTraces().size()); + } +} diff --git a/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/internal/RegionSetTest.java b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/internal/RegionSetTest.java index 686e8d9e8..a74d0471c 100644 --- a/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/internal/RegionSetTest.java +++ b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/internal/RegionSetTest.java @@ -27,7 +27,7 @@ public class RegionSetTest { private void test(final CharSequence expectation, final Procedure1 test) { Function _identity = Functions.identity(); Function _stringFunction = Functions.toStringFunction(); - ArrayListTextSegmentSet _arrayListTextSegmentSet = new ArrayListTextSegmentSet(_identity, _stringFunction); + ArrayListTextSegmentSet _arrayListTextSegmentSet = new ArrayListTextSegmentSet(_identity, _stringFunction, true); final TestableTextSegmentSet set = new TestableTextSegmentSet(_arrayListTextSegmentSet); try { test.apply(set); diff --git a/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/regionaccess/internal/RegionAccessBuilderTest.java b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/regionaccess/internal/RegionAccessBuilderTest.java index 61a687400..79a476774 100644 --- a/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/regionaccess/internal/RegionAccessBuilderTest.java +++ b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/formatting2/regionaccess/internal/RegionAccessBuilderTest.java @@ -13,6 +13,9 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtend2.lib.StringConcatenation; import org.eclipse.xtext.formatting2.debug.TextRegionAccessToString; +import org.eclipse.xtext.formatting2.regionaccess.IHiddenRegion; +import org.eclipse.xtext.formatting2.regionaccess.ISemanticRegion; +import org.eclipse.xtext.formatting2.regionaccess.ISequentialRegion; import org.eclipse.xtext.formatting2.regionaccess.ITextRegionAccess; import org.eclipse.xtext.formatting2.regionaccess.TextRegionAccessBuilder; import org.eclipse.xtext.formatting2.regionaccess.internal.regionaccesstestlanguage.Root; @@ -1433,6 +1436,8 @@ public class RegionAccessBuilderTest { this.validationTestHelper.assertNoErrors(obj); final ITextRegionAccess access1 = this.createFromNodeModel(obj); final ITextRegionAccess access2 = this.serializer.serializeToRegions(obj); + this.assertToStringDoesNotCrash(access1); + this.assertToStringDoesNotCrash(access2); TextRegionAccessToString _cfg = this.cfg(new TextRegionAccessToString().withRegionAccess(access1)); String _plus = (_cfg + "\n"); Assert.assertEquals(exp, _plus); @@ -1444,6 +1449,28 @@ public class RegionAccessBuilderTest { } } + private void assertToStringDoesNotCrash(final ITextRegionAccess access) { + IHiddenRegion _previousHiddenRegion = access.regionForRootEObject().getPreviousHiddenRegion(); + ISequentialRegion current = ((ISequentialRegion) _previousHiddenRegion); + while ((current != null)) { + { + Assert.assertNotNull(current.toString()); + boolean _matched = false; + if (current instanceof IHiddenRegion) { + _matched=true; + current = ((IHiddenRegion)current).getNextSemanticRegion(); + } + if (!_matched) { + if (current instanceof ISemanticRegion) { + _matched=true; + Assert.assertNotNull(((ISemanticRegion)current).getEObjectRegion().toString()); + current = ((ISemanticRegion)current).getNextHiddenRegion(); + } + } + } + } + } + private TextRegionAccessToString cfg(final TextRegionAccessToString toStr) { return toStr.hideColumnExplanation().withTextWidth(10); } diff --git a/org.eclipse.xtext.util/.classpath b/org.eclipse.xtext.util/.classpath index 2c86cbae2..ff4de9542 100644 --- a/org.eclipse.xtext.util/.classpath +++ b/org.eclipse.xtext.util/.classpath @@ -1,15 +1,7 @@ - - - - - - - - - - + + diff --git a/org.eclipse.xtext.util/.project b/org.eclipse.xtext.util/.project index 92f779a2d..2bd39eea9 100644 --- a/org.eclipse.xtext.util/.project +++ b/org.eclipse.xtext.util/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext.util/src/org/eclipse/xtext/util/XtextVersion.xtend b/org.eclipse.xtext.util/src/org/eclipse/xtext/util/XtextVersion.xtend index 33c13671d..02942b6fa 100644 --- a/org.eclipse.xtext.util/src/org/eclipse/xtext/util/XtextVersion.xtend +++ b/org.eclipse.xtext.util/src/org/eclipse/xtext/util/XtextVersion.xtend @@ -30,6 +30,10 @@ class XtextVersion { '2.9.0.201605261059' } + def getAntlrGeneratorVersion() { + '[2.1.1, 3)' + } + def getXtendGradlePluginVersion() { xtextGradlePluginVersion } diff --git a/org.eclipse.xtext.util/xtend-gen/org/eclipse/xtext/util/XtextVersion.java b/org.eclipse.xtext.util/xtend-gen/org/eclipse/xtext/util/XtextVersion.java index 46a5fed99..6ad9808ec 100644 --- a/org.eclipse.xtext.util/xtend-gen/org/eclipse/xtext/util/XtextVersion.java +++ b/org.eclipse.xtext.util/xtend-gen/org/eclipse/xtext/util/XtextVersion.java @@ -53,6 +53,10 @@ public class XtextVersion { return "2.9.0.201605261059"; } + public String getAntlrGeneratorVersion() { + return "[2.1.1, 3)"; + } + public String getXtendGradlePluginVersion() { return this.getXtextGradlePluginVersion(); } diff --git a/org.eclipse.xtext.xtext.bootstrap/.classpath b/org.eclipse.xtext.xtext.bootstrap/.classpath index 8a20c8f74..6eda8c172 100644 --- a/org.eclipse.xtext.xtext.bootstrap/.classpath +++ b/org.eclipse.xtext.xtext.bootstrap/.classpath @@ -1,15 +1,7 @@ - - - - - - - - - - + + diff --git a/org.eclipse.xtext.xtext.bootstrap/.gitignore b/org.eclipse.xtext.xtext.bootstrap/.gitignore new file mode 100644 index 000000000..f3f1c4be1 --- /dev/null +++ b/org.eclipse.xtext.xtext.bootstrap/.gitignore @@ -0,0 +1 @@ +.antlr-generator-*.jar diff --git a/org.eclipse.xtext.xtext.bootstrap/.project b/org.eclipse.xtext.xtext.bootstrap/.project index 771577e67..e9ae22b81 100644 --- a/org.eclipse.xtext.xtext.bootstrap/.project +++ b/org.eclipse.xtext.xtext.bootstrap/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.jdt.core.javanature diff --git a/org.eclipse.xtext.xtext.bootstrap/build.gradle b/org.eclipse.xtext.xtext.bootstrap/build.gradle index f156e1278..60fd5fa30 100644 --- a/org.eclipse.xtext.xtext.bootstrap/build.gradle +++ b/org.eclipse.xtext.xtext.bootstrap/build.gradle @@ -1,26 +1,45 @@ +/* + * Bootstrap project for the Xtext language. It contains an MWE2 generator workflow with + * dedicated configuration code. The workflow generates into the core and generic ide projects + * as well as the Eclipse and IDEA integration projects, which are defined in different + * source repositories. The path to these other repositories is assumed to be ../xtext-eclipse + * and ../xtext-idea, respectively. + */ + +apply from: "${rootDir}/gradle/mwe2-workflows.gradle" + 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). + // Buildship, however, links the workspace projects anyway if a composite build is used. compile "org.eclipse.xtext:org.eclipse.xtext:$versions.xtext_bootstrap" compile "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 - args += "src/org/eclipse/xtext/xtext/bootstrap/GenerateXtext.mwe2" - args += "-p" - args += "rootPath=/${projectDir}/.." +sourceSets.main.java.srcDirs = [] +sourceSets.main.resources.srcDirs = [] +sourceSets.test.java.srcDirs = [] +sourceSets.test.resources.srcDirs = [] + +sourceSets.mwe2 { + java.srcDir 'src' + if (findProperty('compileXtend') == 'true') { + xtendOutputDir = 'xtend-gen' + } else { + java.srcDir 'xtend-gen' + } +} +configurations.mwe2Compile.extendsFrom configurations.compile +jar.from sourceSets.mwe2.output +sourcesJar.from sourceSets.mwe2.allSource + +task generateXtextLanguage(type: XtextGeneratorTask) { + workflow = file('src/org/eclipse/xtext/xtext/bootstrap/GenerateXtext.mwe2') } -// 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) +eclipse { + project { + natures 'org.eclipse.xtext.ui.shared.xtextNature' + buildCommands.add(0,new org.gradle.plugins.ide.eclipse.model.BuildCommand('org.eclipse.xtext.ui.shared.xtextBuilder')) + } +} diff --git a/org.eclipse.xtext.xtext.generator/.classpath b/org.eclipse.xtext.xtext.generator/.classpath index 95bc5ae57..f10cbac4b 100644 --- a/org.eclipse.xtext.xtext.generator/.classpath +++ b/org.eclipse.xtext.xtext.generator/.classpath @@ -1,19 +1,10 @@ - - - - - - - - - - + + - diff --git a/org.eclipse.xtext.xtext.generator/.project b/org.eclipse.xtext.xtext.generator/.project index a6e80ff8d..2ed4d6fd8 100644 --- a/org.eclipse.xtext.xtext.generator/.project +++ b/org.eclipse.xtext.xtext.generator/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.xtend b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.xtend index e0887bb3d..a84143701 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.xtend +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.xtend @@ -737,7 +737,7 @@ class WebIntegrationFragment extends AbstractXtextGeneratorFragment { } override destroy() { - if (disposableRegistry != null) { + if (disposableRegistry !== null) { disposableRegistry.dispose() disposableRegistry = null } diff --git a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.java b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.java index 88006eda9..476662a3a 100644 --- a/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.java +++ b/org.eclipse.xtext.xtext.generator/xtend-gen/org/eclipse/xtext/xtext/generator/web/WebIntegrationFragment.java @@ -1749,7 +1749,7 @@ public class WebIntegrationFragment extends AbstractXtextGeneratorFragment { _builder.append("override destroy() {"); _builder.newLine(); _builder.append("\t\t"); - _builder.append("if (disposableRegistry != null) {"); + _builder.append("if (disposableRegistry !== null) {"); _builder.newLine(); _builder.append("\t\t\t"); _builder.append("disposableRegistry.dispose()"); diff --git a/org.eclipse.xtext.xtext.ide/.classpath b/org.eclipse.xtext.xtext.ide/.classpath index 61b3660a4..6911d19cd 100644 --- a/org.eclipse.xtext.xtext.ide/.classpath +++ b/org.eclipse.xtext.xtext.ide/.classpath @@ -1,14 +1,9 @@ - - - - - + - diff --git a/org.eclipse.xtext.xtext.ide/.project b/org.eclipse.xtext.xtext.ide/.project index 9d143a2fb..71297fddb 100644 --- a/org.eclipse.xtext.xtext.ide/.project +++ b/org.eclipse.xtext.xtext.ide/.project @@ -2,25 +2,23 @@ org.eclipse.xtext.xtext.ide Xtext Language generic IDE support. - + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + org.eclipse.buildship.core.gradleprojectnature org.eclipse.jdt.core.javanature org.eclipse.xtext.ui.shared.xtextNature - - - org.eclipse.xtext.ui.shared.xtextBuilder - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - diff --git a/org.eclipse.xtext.xtext.wizard/.classpath b/org.eclipse.xtext.xtext.wizard/.classpath index 98c52cad1..d1d14ee8a 100644 --- a/org.eclipse.xtext.xtext.wizard/.classpath +++ b/org.eclipse.xtext.xtext.wizard/.classpath @@ -1,20 +1,8 @@ - - - - - - - - - - - - - - - + + + diff --git a/org.eclipse.xtext.xtext.wizard/.project b/org.eclipse.xtext.xtext.wizard/.project index cf0f054bf..df4bb4b44 100644 --- a/org.eclipse.xtext.xtext.wizard/.project +++ b/org.eclipse.xtext.xtext.wizard/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend b/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend index fd002e2da..054f54b47 100644 --- a/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend +++ b/org.eclipse.xtext.xtext.wizard/src/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.xtend @@ -284,6 +284,7 @@ class RuntimeProjectDescriptor extends TestedProjectDescriptor { mwe2 "org.eclipse.emf:org.eclipse.emf.mwe2.launch:«config.xtextVersion.mweVersion»" mwe2 "org.eclipse.xtext:org.eclipse.xtext.common.types:${xtextVersion}" mwe2 "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}" + mwe2 "org.eclipse.xtext:xtext-antlr-generator:«config.xtextVersion.antlrGeneratorVersion»" «IF fromExistingEcoreModels» mwe2 "org.eclipse.xtext:org.eclipse.xtext.generator:${xtextVersion}" mwe2 "org.eclipse.xpand:org.eclipse.xpand:2.0.0" @@ -375,6 +376,11 @@ class RuntimeProjectDescriptor extends TestedProjectDescriptor { org.eclipse.xtext.xbase ${xtextVersion} + + org.eclipse.xtext + xtext-antlr-generator + «config.xtextVersion.antlrGeneratorVersion» + «ENDIF» diff --git a/org.eclipse.xtext.xtext.wizard/xtend-gen/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.java b/org.eclipse.xtext.xtext.wizard/xtend-gen/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.java index 8b67614c8..0e774ba25 100644 --- a/org.eclipse.xtext.xtext.wizard/xtend-gen/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.java +++ b/org.eclipse.xtext.xtext.wizard/xtend-gen/org/eclipse/xtext/xtext/wizard/RuntimeProjectDescriptor.java @@ -596,6 +596,12 @@ public class RuntimeProjectDescriptor extends TestedProjectDescriptor { _builder.append("\t"); _builder.append("mwe2 \"org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}\""); _builder.newLine(); + _builder.append("\t"); + _builder.append("mwe2 \"org.eclipse.xtext:xtext-antlr-generator:"); + String _antlrGeneratorVersion = this.getConfig().getXtextVersion().getAntlrGeneratorVersion(); + _builder.append(_antlrGeneratorVersion, "\t"); + _builder.append("\""); + _builder.newLineIfNotEmpty(); { boolean _isFromExistingEcoreModels = this.isFromExistingEcoreModels(); if (_isFromExistingEcoreModels) { @@ -915,6 +921,29 @@ public class RuntimeProjectDescriptor extends TestedProjectDescriptor { _builder.append(""); _builder.newLine(); _builder.append("\t\t\t"); + _builder.append("\t"); + _builder.append(""); + _builder.newLine(); + _builder.append("\t\t\t"); + _builder.append("\t\t"); + _builder.append("org.eclipse.xtext"); + _builder.newLine(); + _builder.append("\t\t\t"); + _builder.append("\t\t"); + _builder.append("xtext-antlr-generator"); + _builder.newLine(); + _builder.append("\t\t\t"); + _builder.append("\t\t"); + _builder.append(""); + String _antlrGeneratorVersion = this.getConfig().getXtextVersion().getAntlrGeneratorVersion(); + _builder.append(_antlrGeneratorVersion, "\t\t\t\t\t"); + _builder.append(""); + _builder.newLineIfNotEmpty(); + _builder.append("\t\t\t"); + _builder.append("\t"); + _builder.append(""); + _builder.newLine(); + _builder.append("\t\t\t"); _builder.append(""); _builder.newLine(); } diff --git a/org.eclipse.xtext/.classpath b/org.eclipse.xtext/.classpath index 56700aed2..72a5f84c9 100644 --- a/org.eclipse.xtext/.classpath +++ b/org.eclipse.xtext/.classpath @@ -1,32 +1,18 @@ - - - - - - - - - - + + - - - - - - - + diff --git a/org.eclipse.xtext/.project b/org.eclipse.xtext/.project index e30585a4c..c6c3ec72d 100644 --- a/org.eclipse.xtext/.project +++ b/org.eclipse.xtext/.project @@ -15,11 +15,6 @@ - - org.eclipse.buildship.core.gradleprojectbuilder - - - org.eclipse.buildship.core.gradleprojectnature diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/AbstractFormatter2.java b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/AbstractFormatter2.java index 8af98693d..308ec238d 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/AbstractFormatter2.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/AbstractFormatter2.java @@ -21,6 +21,7 @@ import org.eclipse.xtext.formatting2.internal.HiddenRegionFormatting; import org.eclipse.xtext.formatting2.internal.HiddenRegionFormattingMerger; import org.eclipse.xtext.formatting2.internal.HiddenRegionReplacer; import org.eclipse.xtext.formatting2.internal.MultilineCommentReplacer; +import org.eclipse.xtext.formatting2.internal.RegionTraceMissingException; import org.eclipse.xtext.formatting2.internal.RootDocument; import org.eclipse.xtext.formatting2.internal.SingleHiddenRegionFormatter; import org.eclipse.xtext.formatting2.internal.SinglelineCodeCommentReplacer; @@ -264,9 +265,13 @@ public abstract class AbstractFormatter2 implements IFormatter2 { public final List format(FormatterRequest request) { try { initialize(request); - IFormattableDocument document = createFormattableRootDocument(); XtextResource xtextResource = request.getTextRegionAccess().getResource(); - format(xtextResource, document); + IFormattableDocument document = createFormattableRootDocument(); + try { + format(xtextResource, document); + } catch (RegionTraceMissingException e) { + document = handleTraceMissing(document, e); + } List rendered = document.renderToTextReplacements(); List postprocessed = postProcess(document, rendered); return postprocessed; @@ -275,6 +280,17 @@ public abstract class AbstractFormatter2 implements IFormatter2 { } } + protected IFormattableDocument handleTraceMissing(IFormattableDocument problematic, RegionTraceMissingException e) { + if (request.isEnableDebugTracing()) { + return problematic; + } + request.setEnableDebugTracing(true); + XtextResource xtextResource = request.getTextRegionAccess().getResource(); + IFormattableDocument document = createFormattableRootDocument(); + format(xtextResource, document); + return document; + } + /** * Implement this method to create a language-specific formatter. * diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/FormatterRequest.java b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/FormatterRequest.java index 80e335457..f9bc51e3a 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/FormatterRequest.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/FormatterRequest.java @@ -206,6 +206,10 @@ public class FormatterRequest { return ExceptionAcceptor.LOGGING; return exceptionHandler; } + + public IAcceptor getExplicitExceptionHandler() { + return exceptionHandler; + } /** * @see #exceptionHandler @@ -214,4 +218,23 @@ public class FormatterRequest { this.exceptionHandler = problemHandler; return this; } + + /** + * Enable creation of Java stack traces to diagnose conflicting formatting + * instructions. + * + * This option is disabled for performance reasons. It is safe to leave it + * disabled, because in case a conflict happens, the formatter will + * automatically enable this flag and format again. The second pass of the + * formatter will then lead to the desired debug information. + **/ + private boolean enableDebugTracing = false; + + public boolean isEnableDebugTracing() { + return enableDebugTracing; + } + + public void setEnableDebugTracing(boolean enableDebugTracing) { + this.enableDebugTracing = enableDebugTracing; + } } diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/debug/TextRegionAccessToString.java b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/debug/TextRegionAccessToString.java index 43c159e9e..78a8182f1 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/debug/TextRegionAccessToString.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/debug/TextRegionAccessToString.java @@ -79,8 +79,8 @@ public class TextRegionAccessToString { private static final String HIDDEN_PADDED = Strings.padEnd(HIDDEN, TITLE_WIDTH, ' '); private static final String SEMANTIC_PADDED = Strings.padEnd("S", TITLE_WIDTH, ' '); - private Function grammarToString = new GrammarElementTitleSwitch().showRule().showAssignments() - .showQualified(); + private Function grammarToString = new GrammarElementTitleSwitch().showRule() + .showAssignments().showQualified(); private boolean hideColumnExplanation = false; @@ -180,7 +180,23 @@ public class TextRegionAccessToString { } for (String error : errors) result.add(error, false); - int indentation = 0; + int indentation = 0, min = 0; + for (ITextSegment region : list) { + if (region instanceof IHiddenRegion) { + Collection found = hiddens.get((IHiddenRegion) region); + for (IEObjectRegion obj : found) { + boolean p = obj.getNextHiddenRegion().equals(region); + boolean n = obj.getPreviousHiddenRegion().equals(region); + if (p) + indentation--; + else if (n) + indentation++; + if (indentation < min) + min = indentation; + } + } + } + indentation = min < 0 ? min * -1 : 0; for (ITextSegment region : list) { List previous = Lists.newArrayList(); List next = Lists.newArrayList(); diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/ArrayListTextSegmentSet.java b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/ArrayListTextSegmentSet.java index 9e2cbab38..3976aff62 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/ArrayListTextSegmentSet.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/ArrayListTextSegmentSet.java @@ -27,14 +27,20 @@ public class ArrayListTextSegmentSet extends TextSegmentSet { private final List contents = Lists.newArrayList(); - public ArrayListTextSegmentSet(Function region, Function title) { + public ArrayListTextSegmentSet(Function region, + Function title) { super(region, title); } + public ArrayListTextSegmentSet(Function region, + Function title, boolean trace) { + super(region, title, trace); + } + @Override - public void add(T segment, IMerger merger) throws ConflictingRegionsException { + public void add(T segment, IMerger merger) throws ConflictingRegionsException, RegionTraceMissingException { Preconditions.checkNotNull(segment); - getTraces().put(segment, new RegionTrace(getTitle(segment), getRegion(segment))); + trace(segment); if (contents.isEmpty()) { contents.add(segment); } else { @@ -52,7 +58,8 @@ public class ArrayListTextSegmentSet extends TextSegmentSet { return searchResult >= 0 ? contents.get(searchResult) : null; } - protected void insertAtIndex(T segment, int newIndex, IMerger merger) throws ConflictingRegionsException { + protected void insertAtIndex(T segment, int newIndex, IMerger merger) + throws ConflictingRegionsException, RegionTraceMissingException { List conflicting = null; int low = newIndex; while (--low >= 0) { @@ -75,7 +82,7 @@ public class ArrayListTextSegmentSet extends TextSegmentSet { break; } if (conflicting == null) { - getTraces().put(segment, new RegionTrace(getTitle(segment), getRegion(segment))); + trace(segment); contents.add(newIndex, segment); } else { conflicting.add(0, segment); @@ -84,7 +91,7 @@ public class ArrayListTextSegmentSet extends TextSegmentSet { if (merged != null) { for (int i = high - 1; i > low; i--) contents.remove(i); - getTraces().put(merged, new RegionTrace(getTitle(merged), getRegion(merged))); + trace(merged); contents.add(low + 1, merged); } else { int segmentLengh = getRegion(segment).getLength(); @@ -95,7 +102,7 @@ public class ArrayListTextSegmentSet extends TextSegmentSet { for (int i = high - 1; i > low; i--) contents.remove(i); if (segmentLengh > totalLength) { - getTraces().put(segment, new RegionTrace(getTitle(segment), getRegion(segment))); + trace(segment); contents.add(low + 1, segment); } handleConflict(conflicting, null); @@ -113,13 +120,14 @@ public class ArrayListTextSegmentSet extends TextSegmentSet { return Iterables.unmodifiableIterable(contents).iterator(); } - protected void replaceExistingEntry(T segment, int index, IMerger merger) throws ConflictingRegionsException { + protected void replaceExistingEntry(T segment, int index, IMerger merger) + throws ConflictingRegionsException, RegionTraceMissingException { T existing = contents.get(index); List conflicting = ImmutableList.of(segment, existing); try { T merged = merger != null ? merger.merge(conflicting) : null; if (merged != null) { - getTraces().put(merged, new RegionTrace(getTitle(merged), getRegion(merged))); + trace(merged); contents.set(index, merged); } else { contents.remove(index); diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/FormattableDocument.java b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/FormattableDocument.java index a12b59dbb..c31051496 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/FormattableDocument.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/FormattableDocument.java @@ -49,11 +49,16 @@ import com.google.common.collect.Sets; */ public abstract class FormattableDocument implements IFormattableDocument { - private final TextSegmentSet replacers; + private TextSegmentSet replacers = null; protected FormattableDocument() { super(); - this.replacers = createTextReplacerSet(); + } + + protected TextSegmentSet getReplacers() { + if (replacers == null) + replacers = createTextReplacerSet(); + return replacers; } @Override @@ -63,14 +68,13 @@ public abstract class FormattableDocument implements IFormattableDocument { ITextSegment frameRegion = getRegion(); String replacerTitle = replacer.getClass().getSimpleName(); ITextSegment replacerRegion = replacer.getRegion(); - @SuppressWarnings("unchecked") RegionsOutsideFrameException exception = new RegionsOutsideFrameException(frameTitle, frameRegion, Tuples.create(replacerTitle, replacerRegion)); getRequest().getExceptionHandler().accept(exception); return; } try { - replacers.add(replacer, getFormatter().createTextReplacerMerger()); + getReplacers().add(replacer, getFormatter().createTextReplacerMerger()); } catch (ConflictingRegionsException e) { getRequest().getExceptionHandler().accept(e); } @@ -122,7 +126,7 @@ public abstract class FormattableDocument implements IFormattableDocument { ITextReplacerContext wrappable = null; Set wrapped = Sets.newHashSet(); LinkedList queue = new LinkedList(); - for (ITextReplacer replacer : replacers) { + for (ITextReplacer replacer : getReplacers()) { queue.add(replacer); } while (!queue.isEmpty()) { @@ -136,7 +140,7 @@ public abstract class FormattableDocument implements IFormattableDocument { // then doesn't while (context != wrappable) { ITextReplacer r = context.getReplacer(); - if (r != null && replacers.get(r) == r) { + if (r != null && getReplacers().get(r) == r) { queue.addFirst(r); } context = context.getPreviousContext(); @@ -179,7 +183,7 @@ public abstract class FormattableDocument implements IFormattableDocument { .apply(((HiddenRegionReplacer) input).getFormatting()); return input.getClass().getSimpleName(); } - }); + }, getRequest().isEnableDebugTracing()); } @Override @@ -188,6 +192,8 @@ public abstract class FormattableDocument implements IFormattableDocument { if (formatter.shouldFormat(obj, this)) { try { formatter.format(obj, this); + } catch (RegionTraceMissingException e) { + throw e; } catch (Exception e) { IAcceptor handler = getRequest().getExceptionHandler(); handler.accept(e); @@ -350,7 +356,7 @@ public abstract class FormattableDocument implements IFormattableDocument { TextRegionsToString toString = new TextRegionsToString(); toString.setFrame(this.getRegion()); toString.setTitle(getClass().getSimpleName() + " with ITextReplacers"); - for (ITextReplacer repl : replacers) + for (ITextReplacer repl : getReplacers()) toString.add(repl.getRegion(), repl.getClass().getSimpleName() + ": " + repl.toString()); return toString.toString(); } diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/RegionTraceMissingException.java b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/RegionTraceMissingException.java new file mode 100644 index 000000000..578cd4965 --- /dev/null +++ b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/RegionTraceMissingException.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2017 TypeFox GmbH (http://www.typefox.io) 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.formatting2.internal; + +/** + * @author Moritz Eysholdt - Initial contribution and API + */ +public class RegionTraceMissingException extends RuntimeException { + + private static final long serialVersionUID = -1151660462702454003L; + + public RegionTraceMissingException(Throwable cause) { + super(cause); + } + +} diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/TextReplacerContext.java b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/TextReplacerContext.java index 612e253e8..239f05fe8 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/TextReplacerContext.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/TextReplacerContext.java @@ -66,7 +66,7 @@ public class TextReplacerContext implements ITextReplacerContext { public String apply(ITextReplacement input) { return input.getReplacementText(); } - }); + }, getDocument().getRequest().isEnableDebugTracing()); } @Override @@ -223,7 +223,6 @@ public class TextReplacerContext implements ITextReplacerContext { String frameTitle = replacer.getClass().getSimpleName(); ITextSegment frameRegion = replacer.getRegion(); String replacerTitle = replacement.getReplacementText(); - @SuppressWarnings("unchecked") RegionsOutsideFrameException exception = new RegionsOutsideFrameException(frameTitle, frameRegion, Tuples.create(replacerTitle, (ITextSegment) replacement)); request.getExceptionHandler().accept(exception); diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/TextSegmentSet.java b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/TextSegmentSet.java index 777175fb6..17b85ff5c 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/TextSegmentSet.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/formatting2/internal/TextSegmentSet.java @@ -24,15 +24,21 @@ public abstract class TextSegmentSet implements Iterable { private final Function regionGetter; private final Function titleGetter; - private final IdentityHashMap traces = new IdentityHashMap(); + private final IdentityHashMap traces; public TextSegmentSet(Function region, Function title) { + this(region, title, true); + } + + public TextSegmentSet(Function region, Function title, + boolean trace) { super(); this.regionGetter = region; this.titleGetter = title; + this.traces = trace ? new IdentityHashMap() : null; } - public void add(T segment) throws ConflictingRegionsException { + public void add(T segment) throws ConflictingRegionsException, RegionTraceMissingException { add(segment, null); } @@ -52,11 +58,22 @@ public abstract class TextSegmentSet implements Iterable { return titleGetter.apply(t); } + @Deprecated public IdentityHashMap getTraces() { return traces; } - protected void handleConflict(List conflicts, Exception cause) throws ConflictingRegionsException { + protected void trace(T segment) { + if (traces != null) { + traces.put(segment, new RegionTrace(getTitle(segment), getRegion(segment))); + } + } + + protected void handleConflict(List conflicts, Exception cause) + throws ConflictingRegionsException, RegionTraceMissingException { + if (traces == null) { + throw new RegionTraceMissingException(cause); + } List causes = Lists.newArrayList(); for (T t : conflicts) { RegionTrace exception = traces.get(t); diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/grammaranalysis/impl/GrammarElementTitleSwitch.java b/org.eclipse.xtext/src/org/eclipse/xtext/grammaranalysis/impl/GrammarElementTitleSwitch.java index da29767d4..057e2700e 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/grammaranalysis/impl/GrammarElementTitleSwitch.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/grammaranalysis/impl/GrammarElementTitleSwitch.java @@ -211,7 +211,13 @@ public class GrammarElementTitleSwitch extends XtextSwitch implements Fu @Override public String caseRuleCall(RuleCall object) { - return addCrossRefOrAssignemnt(object.getRule().getName(), object) + card(object); + AbstractRule rule = object.getRule(); + String ruleName; + if (rule != null && !rule.eIsProxy()) + ruleName = rule.getName(); + else + ruleName = "unresolved_rule"; + return addCrossRefOrAssignemnt(ruleName, object) + card(object); } @Override