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;