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 bc0e2f36089c..6e1a05ce07ad 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 @@ -741,8 +741,8 @@ public class DeclarationParser { PsiBuilder.Marker pair = builder.mark(); if (mayBeSimple) { - final PsiBuilder.Marker value = parseAnnotationValue(builder); - if (value != null && builder.getTokenType() != JavaTokenType.EQ) { + parseAnnotationValue(builder); + if (builder.getTokenType() != JavaTokenType.EQ) { pair.done(JavaElementType.NAME_VALUE_PAIR); return false; } @@ -762,9 +762,9 @@ public class DeclarationParser { return hasName; } - @Nullable + @NotNull private static PsiBuilder.Marker parseAnnotationValue(final PsiBuilder builder) { - final PsiBuilder.Marker result; + PsiBuilder.Marker result; final IElementType tokenType = builder.getTokenType(); if (tokenType == JavaTokenType.AT) { @@ -778,8 +778,10 @@ public class DeclarationParser { } if (result == null) { - error(builder, JavaErrorMessages.message("expected.value")); + result = builder.mark(); + result.error(JavaErrorMessages.message("expected.value")); } + return result; } diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java new file mode 100644 index 000000000000..200c37e7fa32 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.java @@ -0,0 +1,2 @@ +@Ann(0) class D { +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt new file mode 100644 index 000000000000..9f1efdb6d2e4 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Errors.txt @@ -0,0 +1,73 @@ +PsiJavaFile:Errors.java + PsiImportList + + PsiClass:D + PsiModifierList:@Ann(0) + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Ann + PsiIdentifier:Ann('Ann') + PsiReferenceParameterList + + PsiAnnotationParameterList + PsiJavaToken:LPARENTH('(') + PsiNameValuePair + PsiErrorElement:Value expected + + PsiErrorElement:',' or ')' expected + + PsiJavaToken:LT('<') + PsiNameValuePair + PsiIdentifier:error('error') + PsiErrorElement:'=' expected + + PsiWhiteSpace(' ') + PsiReferenceExpression:descr + PsiReferenceParameterList + + PsiIdentifier:descr('descr') + PsiErrorElement:',' or ')' expected + + PsiJavaToken:EQ('=') + PsiNameValuePair + PsiErrorElement:Identifier expected + + PsiErrorElement:'=' expected + + PsiBinaryExpression:"Cannot find method 'value'">0< + PsiBinaryExpression:"Cannot find method 'value'">0 + PsiLiteralExpression:"Cannot find method 'value'" + PsiJavaToken:STRING_LITERAL('"Cannot find method 'value'"') + PsiJavaToken:GT('>') + PsiLiteralExpression:0 + PsiJavaToken:INTEGER_LITERAL('0') + PsiJavaToken:LT('<') + PsiErrorElement:Expression expected + + PsiErrorElement:',' or ')' expected + + PsiJavaToken:DIV('/') + PsiNameValuePair + PsiIdentifier:error('error') + PsiErrorElement:'=' expected + + PsiErrorElement:Value expected + + PsiErrorElement:',' or ')' expected + + PsiJavaToken:GT('>') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:D('D') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple.java b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple1.java similarity index 100% rename from java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple.java rename to java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple1.java diff --git a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple.txt b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple1.txt similarity index 97% rename from java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple.txt rename to java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple1.txt index 3bf8f2a6e61e..7213017754c0 100644 --- a/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple.txt +++ b/java/java-tests/testData/psi/parser-full/annotationParsing/annotation/Simple1.txt @@ -1,4 +1,4 @@ -PsiJavaFile:Simple.java +PsiJavaFile:Simple1.java PsiImportList PsiClass:TimeTravel diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/annotationParsing/AnnotationParsingTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/annotationParsing/AnnotationParsingTest.java index dcaf2e0cf4dd..640107cf62cf 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/annotationParsing/AnnotationParsingTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/annotationParsing/AnnotationParsingTest.java @@ -14,7 +14,7 @@ public class AnnotationParsingTest extends JavaParsingTestCase { } public void testMarker() { doTest(true); } - public void testSimple() { doTest(true); } + public void testSimple1() { doTest(true); } public void testSimple2() { doTest(true); } public void testComplex() { doTest(true); } public void testMultiple() { doTest(true); } @@ -40,4 +40,6 @@ public class AnnotationParsingTest extends JavaParsingTestCase { } }); } + + public void testErrors() { doTest(true); } }