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 bf413016b16d..7cb23e6b852f 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 @@ -87,8 +87,9 @@ public class DeclarationParser { } error.error(JavaErrorMessages.message("expected.lbrace")); } - - parseClassBodyWithBraces(builder, isAnnotation, isEnum); + else { + parseClassBodyWithBraces(builder, isAnnotation, isEnum); + } if (context == Context.FILE) { boolean declarationsAfterEnd = false; @@ -252,7 +253,8 @@ public class DeclarationParser { } } else if (ElementType.CLASS_KEYWORD_BIT_SET.contains(builder.getTokenType())) { - return parseClassFromKeyword(builder, declaration, false, context); + final PsiBuilder.Marker result = parseClassFromKeyword(builder, declaration, false, context); + return result != null ? result : modList; } PsiBuilder.Marker typeParams = null; diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/Error.java b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Error.java new file mode 100644 index 000000000000..9191e2bc5980 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Error.java @@ -0,0 +1 @@ +public class B {} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/Error.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Error.txt new file mode 100644 index 000000000000..4adc49249ad8 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Error.txt @@ -0,0 +1,26 @@ +PsiJavaFile:Error.java + PsiImportList + + PsiModifierList:public + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiKeyword:class('class') + PsiErrorElement:Identifier expected + + PsiWhiteSpace(' ') + PsiModifierList: + + PsiErrorElement:'class' or 'interface' expected + + PsiTypeParameterList + PsiJavaToken:LT('<') + PsiTypeParameter:caret + PsiIdentifier:caret('caret') + PsiElement(EXTENDS_BOUND_LIST) + + PsiJavaToken:GT('>') + PsiErrorElement:'class' or 'interface' expected + PsiIdentifier:B('B') + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + 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 8e46224e337d..3acd5add4902 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 @@ -35,7 +35,7 @@ public class ClassParsingTest extends JavaParsingTestCase { public void testIncompleteAnnotation() { doTestDefaultParser(true); } // todo: fix public void testExtraOpeningBraceInMethod() { doTestDefaultParser(true); } // todo: fix - public void testExtraClosingBraceInMethod() { doTest(true);} + public void testExtraClosingBraceInMethod() { doTest(true); } - public void testError() { doTestDefaultParser(true);} // todo: fix + public void testError() { doTest(true); } }