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 super TestableTextSegmentSet> test) {
Function _identity = Functions.identity();
Function
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 super T, ? extends ITextSegment> region, Function super T, String> title) {
+ public ArrayListTextSegmentSet(Function super T, ? extends ITextSegment> region,
+ Function super T, String> title) {
super(region, title);
}
+ public ArrayListTextSegmentSet(Function super T, ? extends ITextSegment> region,
+ Function super T, String> 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 super T, ? extends ITextSegment> regionGetter;
private final Function super T, String> titleGetter;
- private final IdentityHashMap traces = new IdentityHashMap();
+ private final IdentityHashMap traces;
public TextSegmentSet(Function super T, ? extends ITextSegment> region, Function super T, String> title) {
+ this(region, title, true);
+ }
+
+ public TextSegmentSet(Function super T, ? extends ITextSegment> region, Function super T, String> 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