Bug 567319 - Parser error while editor => build failures popup and
editor doesn't start
Change-Id: I9517add3382d0cf4561174b6e7e199a036583573
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchExpressionsYieldTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchExpressionsYieldTest.java
index bb95d47..7cb9cfa 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchExpressionsYieldTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SwitchExpressionsYieldTest.java
@@ -5925,4 +5925,37 @@
"----------\n"
);
}
+ public void testBug567112_001() {
+ runNegativeTest(
+ new String[] {
+ "X.java",
+ "import java.util.ArrayList;\n"+
+ "\n"+
+ "public class X {\n"+
+ " public void foo() {\n"+
+ " new ArrayList<>().stream().filter(p -> p != null)\n"+
+ " switch (\"\") {\n"+
+ " case \"\":\n"+
+ " }\n"+
+ " }\n"+
+ "}"
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " new ArrayList<>().stream().filter(p -> p != null)\n" +
+ " ^^^^^\n" +
+ "Syntax error on tokens, delete these tokens\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 8)\n" +
+ " }\n" +
+ " ^\n" +
+ "Syntax error, insert \")\" to complete Expression\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 8)\n" +
+ " }\n" +
+ " ^\n" +
+ "Syntax error, insert \";\" to complete BlockStatements\n" +
+ "----------\n"
+ );
+ }
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
index 02bf1d2..f3e57ae 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
@@ -5631,8 +5631,8 @@
}
int disambiguatedToken(int token) {
final VanguardParser parser = getVanguardParser();
- if (token == TokenNameARROW && mayBeAtCaseLabelExpr()) {
- assert this.caseStartPosition < this.startPosition;
+ if (token == TokenNameARROW && mayBeAtCaseLabelExpr() && this.caseStartPosition < this.startPosition) {
+ // this.caseStartPosition > this.startPositionpossible on recovery - bother only about correct ones.
int nSz = this.startPosition - this.caseStartPosition;
// add fake token of TokenNameCOLON, call vanguard on this modified source
// TODO: Inefficient method due to redoing of the same source, investigate alternate