### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java,v retrieving revision 1.10 diff -u -r1.10 ASTConverterBugsTest.java --- src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java 5 Feb 2008 15:48:33 -0000 1.10 +++ src/org/eclipse/jdt/core/tests/dom/ASTConverterBugsTest.java 19 Mar 2008 09:33:27 -0000 @@ -737,4 +737,89 @@ "No problem", result); } +/** + * @bug 218824: [DOM/AST] incorrect code leads to IllegalArgumentException during AST creation + * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=218824" + */ +public void testBug218824a() throws JavaModelException { + ASTResult result = this.buildMarkedAST( + "/Converter15/src/a/X.java", + "package a;\n" + + "public class X {\n"+ + " public void takeParam(int i) {\n"+ + " // do something\n"+ + " }\n"+ + "\n"+ + " void test() {\n"+ + " char c = 'a';\n"+ + " public void takeParam(int i) {\n"+ + " // do something\n"+ + " }\n"+ + "\n"+ + " void test() {\n"+ + " char c = 'a';\n"+ + " takeParam((int) c);\n"+ + " }[*1*]takeParam([*1*](int) c);\n"+ + " }\n"+ + "}\n"); + + assertASTResult( + "===== AST =====\n" + + "package a;\n" + + "public class X {\n" + + " public void takeParam( int i){\n" + + " }\n" + + " void test(){\n" + + " char c=\'a\';\n" + + " public void takeParam;\n" + + " int i;\n" + + " new test(){\n" + + " char c=\'a\';\n" + + "{\n" + + " takeParam((int)c);\n" + + " }\n" + + " [*1*]void takeParam(){\n" + + " }[*1*]\n" + + " }\n" + + ";\n" + + " }\n" + + "}\n" + + "\n" + + "===== Details =====\n" + + "1:METHOD_DECLARATION,[447,10],,MALFORMED,[null]\n" + + "===== Problems =====\n" + + "1. ERROR in /Converter15/src/a/X.java (at line 9)\n" + + " public void takeParam(int i) {\n" + + " ^^^^^^^^^\n" + + "void is an invalid type for the variable takeParam\n" + + "2. ERROR in /Converter15/src/a/X.java (at line 9)\n" + + " public void takeParam(int i) {\n" + + " ^\n" + + "Syntax error on token \"(\", ; expected\n" + + "3. ERROR in /Converter15/src/a/X.java (at line 9)\n" + + " public void takeParam(int i) {\n" + + " ^\n" + + "Syntax error on token \")\", ; expected\n" + + "4. ERROR in /Converter15/src/a/X.java (at line 13)\n" + + " void test() {\n" + + " ^^^^\n" + + "Syntax error on token \"void\", new expected\n" + + "5. ERROR in /Converter15/src/a/X.java (at line 13)\n" + + " void test() {\n" + + " ^^^^\n" + + "test cannot be resolved to a type\n" + + "6. ERROR in /Converter15/src/a/X.java (at line 14)\n" + + " char c = \'a\';\n" + + " ^\n" + + "Syntax error on token \";\", { expected after this token\n" + + "7. ERROR in /Converter15/src/a/X.java (at line 16)\n" + + " }takeParam((int) c);\n" + + " ^\n" + + "Syntax error, insert \"}\" to complete ClassBody\n" + + "8. ERROR in /Converter15/src/a/X.java (at line 16)\n" + + " }takeParam((int) c);\n" + + " ^\n" + + "Syntax error, insert \";\" to complete Statement\n", + result); +} } #P org.eclipse.jdt.core.tests.compiler Index: src/org/eclipse/jdt/core/tests/compiler/parser/DietRecoveryTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/DietRecoveryTest.java,v retrieving revision 1.54 diff -u -r1.54 DietRecoveryTest.java --- src/org/eclipse/jdt/core/tests/compiler/parser/DietRecoveryTest.java 6 Mar 2008 15:31:38 -0000 1.54 +++ src/org/eclipse/jdt/core/tests/compiler/parser/DietRecoveryTest.java 19 Mar 2008 09:33:29 -0000 @@ -4656,7 +4656,7 @@ " void foo() {\n" + " }\n" + " }\n" + - " int hello;\n" + + " ba = $missing$;\n" + " }\n" + "}\n"; #P org.eclipse.jdt.core Index: compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java,v retrieving revision 1.62 diff -u -r1.62 RecoveredMethod.java --- compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java 25 Jan 2008 11:59:19 -0000 1.62 +++ compiler/org/eclipse/jdt/internal/compiler/parser/RecoveredMethod.java 19 Mar 2008 09:33:31 -0000 @@ -384,6 +384,18 @@ } } } + } else { + if (methodDeclaration.declarationSourceEnd == 0) { + if (methodDeclaration.sourceEnd + 1 == methodDeclaration.bodyStart) { + // right brace is missing + methodDeclaration.declarationSourceEnd = methodDeclaration.sourceEnd; + methodDeclaration.bodyStart = methodDeclaration.sourceEnd; + methodDeclaration.bodyEnd = methodDeclaration.sourceEnd; + } else { + methodDeclaration.declarationSourceEnd = methodDeclaration.bodyStart; + methodDeclaration.bodyEnd = methodDeclaration.bodyStart; + } + } } if (localTypeCount > 0) methodDeclaration.bits |= ASTNode.HasLocalType; return methodDeclaration; Index: dom/org/eclipse/jdt/core/dom/ASTConverter.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java,v retrieving revision 1.259 diff -u -r1.259 ASTConverter.java --- dom/org/eclipse/jdt/core/dom/ASTConverter.java 25 Jan 2008 11:59:21 -0000 1.259 +++ dom/org/eclipse/jdt/core/dom/ASTConverter.java 19 Mar 2008 09:33:32 -0000 @@ -531,6 +531,7 @@ } } else { // syntax error in this method declaration + methodDecl.setFlags(methodDecl.getFlags() | ASTNode.MALFORMED); if (!methodDeclaration.isNative() && !methodDeclaration.isAbstract()) { start = retrieveStartBlockPosition(methodHeaderEnd, declarationSourceEnd); if (start == -1) start = methodDeclaration.bodyStart; // use recovery position for body start