diff --git a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index 95d2deb49f20..fa31733fbcd3 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -414,13 +414,7 @@ public class DeclarationParser { } final IElementType tokenType = builder.getTokenType(); - if (tokenType == JavaTokenType.SEMICOLON) { - builder.advanceLexer(); - } - else if (tokenType == JavaTokenType.LBRACE) { - StatementParser.parseCodeBlock(builder); - } - else { + if (tokenType != JavaTokenType.SEMICOLON && tokenType != JavaTokenType.LBRACE) { final PsiBuilder.Marker error = builder.mark(); // heuristic: going to next line obviously means method signature is over, starting new method (actually, another one completion hack) final CharSequence text = builder.getOriginalText(); @@ -436,6 +430,12 @@ public class DeclarationParser { error.error(JavaErrorMessages.message("expected.lbrace.or.semicolon")); } + if (!expect(builder, JavaTokenType.SEMICOLON)) { + if (builder.getTokenType() == JavaTokenType.LBRACE) { + StatementParser.parseCodeBlock(builder); + } + } + declaration.done(anno ? JavaElementType.ANNOTATION_METHOD : JavaElementType.METHOD); return declaration; } diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors3.java b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors3.java new file mode 100644 index 000000000000..c3fe1cc56b94 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors3.java @@ -0,0 +1,5 @@ +class C { + public Object fa(int toDelete) sdfskdlfabcdavcd { + return null; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors3.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors3.txt new file mode 100644 index 000000000000..b71eb3083384 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors3.txt @@ -0,0 +1,60 @@ +PsiJavaFile:Errors3.java + PsiImportList + + PsiClass:C + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:C('C') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiMethod:fa + PsiModifierList:public + PsiKeyword:public('public') + PsiTypeParameterList + + PsiWhiteSpace(' ') + PsiTypeElement:Object + PsiJavaCodeReferenceElement:Object + PsiIdentifier:Object('Object') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:fa('fa') + PsiParameterList:(int toDelete) + PsiJavaToken:LPARENTH('(') + PsiParameter:toDelete + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:toDelete('toDelete') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiErrorElement:'{' or ';' expected + PsiIdentifier:sdfskdlfabcdavcd('sdfskdlfabcdavcd') + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiReturnStatement + PsiKeyword:return('return') + PsiWhiteSpace(' ') + PsiLiteralExpression:null + PsiJavaToken:NULL_KEYWORD('null') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/ClassParsingTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/ClassParsingTest.java index e70ef0b50448..8230c535aead 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/ClassParsingTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/ClassParsingTest.java @@ -40,4 +40,5 @@ public class ClassParsingTest extends JavaParsingTestCase { public void testErrors0() { doTest(true); } public void testErrors1() { doTest(true); } public void testErrors2() { doTest(true); } + public void testErrors3() { doTest(true); } }