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