Fix for Bug 432051 ASTParser crashes with IAE for broken source
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java
index 385668f..d182695 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter18Test.java
@@ -20,6 +20,7 @@
import org.eclipse.jdt.core.BindingKey;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.JavaModelException;
@@ -4325,4 +4326,40 @@
// assert that KeyToSignature doesn't throw AIOOBE, the result containing '!*' is a workaround for now, see https://bugs.eclipse.org/429264
assertEquals("wrong signature", "<T::Ljava.lang.Comparable<-TT;>;>()LComparator<!*>;", new BindingKey(method.getKey()).toSignature());
}
+/**
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=432051
+ *
+ * @throws JavaModelException
+ */
+public void testBug432051() throws JavaModelException {
+ String contents =
+ "public class X {\n" +
+ " * Delete line '/**' above.\n" +
+ " *\n" +
+ " * @param a (for example 'QVector')\n" +
+ " * @param declaringMember the context for resolving (made in)\n" +
+ " * @return if\n" +
+ " */\n" +
+ " void foo() {\n" +
+ " }\n" +
+ "}\n";
+ this.workingCopy = getWorkingCopy("/Converter18/src/test432051/X.java", contents, true/*computeProblems*/);
+ IJavaProject javaProject = this.workingCopy.getJavaProject();
+ class BindingRequestor extends ASTRequestor {
+ ITypeBinding _result = null;
+ public void acceptBinding(String bindingKey, IBinding binding) {
+ if (this._result == null && binding != null && binding.getKind() == IBinding.TYPE)
+ this._result = (ITypeBinding) binding;
+ }
+ }
+ final BindingRequestor requestor = new BindingRequestor();
+ final ASTParser parser = ASTParser.newParser(AST.JLS8);
+ parser.setResolveBindings(false);
+ parser.setProject(javaProject);
+ try {
+ parser.createASTs(new ICompilationUnit[] {this.workingCopy}, new String[0], requestor, null);
+ } catch (IllegalArgumentException e) {
+ assertTrue("Test Failed", false);
+ }
+}
}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
index d0096c5..851448b 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
@@ -503,6 +503,8 @@
methodName.internalSetIdentifier(new String(methodDeclaration.selector));
int start = methodDeclaration.sourceStart;
int end = retrieveIdentifierEndPosition(start, methodDeclaration.sourceEnd);
+ if (end < start)
+ end = start + methodDeclaration.selector.length;// naive recovery with method name
methodName.setSourceRange(start, end - start + 1);
methodDecl.setName(methodName);
org.eclipse.jdt.internal.compiler.ast.TypeReference[] thrownExceptions = methodDeclaration.thrownExceptions;