Bug 569502 - Parser hangs during completion / reconcile ?

- incl. NPE fix in RecoveredMethodMapping.toString() (debug)
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
index e8fcbeb..a04c77c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
@@ -17345,6 +17345,7 @@
 //{ObjectTeams: more state to restore
 	this.currentIsRole = false;
 // SH}
+	this.scanner.caseStartPosition = -1;
 }
 /*
  * Reset context so as to resume to regular parse loop
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredMethodMapping.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredMethodMapping.java
index 395c73f..f7ffc1f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredMethodMapping.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredMethodMapping.java
@@ -246,8 +246,12 @@
 	StringBuffer result = new StringBuffer(tabString(tab));
 	result.append("Recovered method mapping:\n"); //$NON-NLS-1$
 	this.methodMappingDeclaration.print(tab + 1, result);
-	for (int i = 0; i < this.baseMethodCount; i++)
-		result.append(this.baseMethods[i].toString(tab + 1));
+	for (int i = 0; i < this.baseMethodCount; i++) {
+		if (this.baseMethods != null)
+			result.append(this.baseMethods[i].toString(tab + 1));
+		else
+			result.append("<no base method>"); //$NON-NLS-1$
+	}
 	return result.toString();
 }
 /*
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 d5b9bcf..afa3380 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
@@ -6575,7 +6575,11 @@
 }
 int disambiguatedToken(int token) {
 	final VanguardParser parser = getVanguardParser();
-	if (token == TokenNameARROW  &&  mayBeAtCaseLabelExpr() &&  this.caseStartPosition < this.startPosition) {
+	if (token == TokenNameARROW  &&  mayBeAtCaseLabelExpr() &&
+//{ObjectTeams: don't be confused by unset caseStartPosition (JDT bug?)
+			this.caseStartPosition != -1 &&
+// SH}
+			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