Bug 577270 - Disambiguation for '->' fails with latest changes from JDT
fix regression in
- Syntax.test851_nonroleMethodBinding{4,7} (integrate DiagnoseParser)
- ASTRewritingSwitchExpressionsTest (no OTJ parsing searching pos of ->)
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 4015d57..4cc92ac 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
@@ -38,6 +38,7 @@
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.impl.JavaFeature;
+import org.eclipse.jdt.internal.compiler.parser.diagnose.DiagnoseParser;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
import org.eclipse.jdt.internal.compiler.util.CharDeduplication;
@@ -2257,10 +2258,17 @@
if (this.activeParser instanceof VanguardParser) {
Goal goal = ((VanguardParser)this.activeParser).currentGoal;
return !(goal == Goal.LambdaParameterListGoal || goal == Goal.PatternGoal || goal == Goal.SwitchLabelCaseLhsGoal);
- } else if (this.activeParser instanceof Parser) {
- Parser parser = (Parser) this.activeParser;
+ } else {
+ Parser parser = null;
+ if (this.activeParser instanceof DiagnoseParser) {
+ parser = ((DiagnoseParser) this.activeParser).parser;
+ } else if (this.activeParser instanceof Parser) {
+ parser = (Parser) this.activeParser;
+ } else {
+ return true;
+ }
if (parser.referenceContext instanceof AbstractMethodDeclaration)
- return false; // no callout inside a method :)
+ return false; // no callout inside a method (incl. the case of local types in a method):)
int ptr = parser.astPtr;
while (ptr > -1) {
ASTNode topAstNode = parser.astStack[ptr];
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.java
index 9f41417..516f545 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/diagnose/DiagnoseParser.java
@@ -94,7 +94,12 @@
int statePoolTop;
StateInfo[] statePool;
+//{ObjectTeams: make accessible:
+/* orig:
private Parser parser;
+ :giro */
+ public Parser parser;
+// SH}
private RecoveryScanner recoveryScanner;
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
index 2577755..98430ee 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
@@ -3711,8 +3711,18 @@
oldToken = TerminalTokens.TokenNameARROW;
newVal = ":"; //$NON-NLS-1$
}
+//{ObjectTeams: here we don't care about BINDOUT, only ARROW:
+ Scanner realScanner = getScanner().getScanner();
+ boolean prev = realScanner.parseOTJonly;
+ realScanner.parseOTJonly = false;
+ realScanner.resetOTFlags();
+//SH}
pos = getScanner().getTokenStartOffset(oldToken, pos);
tokenEnd = getScanner().getTokenEndOffset(oldToken, pos);
+//{ObjectTeams: reset:
+ realScanner.parseOTJonly = prev;
+ realScanner.resetOTFlags();
+// SH}
doTextRemove(pos, tokenEnd - pos, editGroup);
doTextInsert(pos, newVal, editGroup);
pos = tokenEnd;