From c9e9b741f0206dad1501f07453e1ef6aefd999d4 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 14 Feb 2013 12:51:24 +0100 Subject: [PATCH] Parse annotations on array dimensions --- .../lang/java/parser/ExpressionParser.java | 72 ++++++++++--------- .../declarationParsing/class/Errors4.txt | 23 +++--- 2 files changed, 50 insertions(+), 45 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java index a22bd2ec6ae9..e703c93d4a3c 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/ExpressionParser.java @@ -684,15 +684,15 @@ public class ExpressionParser { } @NotNull - private PsiBuilder.Marker parseNew(final PsiBuilder builder, @Nullable final PsiBuilder.Marker start) { - final PsiBuilder.Marker newExpr = (start != null ? start.precede() : builder.mark()); + private PsiBuilder.Marker parseNew(PsiBuilder builder, @Nullable PsiBuilder.Marker start) { + PsiBuilder.Marker newExpr = (start != null ? start.precede() : builder.mark()); builder.advanceLexer(); myParser.getReferenceParser().parseReferenceParameterList(builder, false, true); - final PsiBuilder.Marker refOrType; + PsiBuilder.Marker refOrType; - final IElementType tokenType = builder.getTokenType(); + IElementType tokenType = builder.getTokenType(); if (tokenType == JavaTokenType.IDENTIFIER || tokenType == JavaTokenType.AT) { refOrType = myParser.getReferenceParser().parseJavaCodeReference(builder, true, true, true, true); if (refOrType == null) { @@ -718,42 +718,46 @@ public class ExpressionParser { myParser.getDeclarationParser().parseClassBodyWithBraces(builder, false, false); classElement.done(JavaElementType.ANONYMOUS_CLASS); } + newExpr.done(JavaElementType.NEW_EXPRESSION); + return newExpr; } - else { - if (builder.getTokenType() != JavaTokenType.LBRACKET) { - error(builder, refOrType == null ? - JavaErrorMessages.message("expected.lbracket") : JavaErrorMessages.message("expected.lparen.or.lbracket")); + + myParser.getDeclarationParser().parseAnnotations(builder); + + if (builder.getTokenType() != JavaTokenType.LBRACKET) { + error(builder, refOrType == null ? JavaErrorMessages.message("expected.lbracket") : JavaErrorMessages.message("expected.lparen.or.lbracket")); + newExpr.done(JavaElementType.NEW_EXPRESSION); + return newExpr; + } + + int bracketCount = 0; + int dimCount = 0; + while (true) { + myParser.getDeclarationParser().parseAnnotations(builder); + + if (builder.getTokenType() != JavaTokenType.LBRACKET) break; + builder.advanceLexer(); + + if (bracketCount == dimCount) { + final PsiBuilder.Marker dimExpr = parse(builder); + if (dimExpr != null) { + dimCount++; + } + } + bracketCount++; + + if (!expectOrError(builder, JavaTokenType.RBRACKET, "expected.rbracket")) { newExpr.done(JavaElementType.NEW_EXPRESSION); return newExpr; } + } - int bracketCount = 0; - int dimCount = 0; - while (true) { - if (builder.getTokenType() != JavaTokenType.LBRACKET) break; - builder.advanceLexer(); - - if (bracketCount == dimCount) { - final PsiBuilder.Marker dimExpr = parse(builder); - if (dimExpr != null) { - dimCount++; - } - } - bracketCount++; - - if (!expectOrError(builder, JavaTokenType.RBRACKET, "expected.rbracket")) { - newExpr.done(JavaElementType.NEW_EXPRESSION); - return newExpr; - } + if (dimCount == 0) { + if (builder.getTokenType() == JavaTokenType.LBRACE) { + parseArrayInitializer(builder); } - - if (dimCount == 0) { - if (builder.getTokenType() == JavaTokenType.LBRACE) { - parseArrayInitializer(builder); - } - else { - error(builder, JavaErrorMessages.message("expected.array.initializer")); - } + else { + error(builder, JavaErrorMessages.message("expected.array.initializer")); } } diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors4.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors4.txt index 8380253fd361..f35984d7baaf 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors4.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Errors4.txt @@ -55,6 +55,7 @@ PsiJavaFile:Errors4.java PsiJavaToken:EQ('=') PsiWhiteSpace(' ') PsiNewExpression:new Linked + @Deprecated PsiKeyword:new('new') PsiReferenceParameterList @@ -63,22 +64,22 @@ PsiJavaFile:Errors4.java PsiIdentifier:Linked('Linked') PsiReferenceParameterList + PsiWhiteSpace('\n ') + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:Deprecated + PsiIdentifier:Deprecated('Deprecated') + PsiReferenceParameterList + + PsiAnnotationParameterList + PsiErrorElement:'(' or '[' expected PsiErrorElement:';' expected - PsiWhiteSpace('\n ') + PsiWhiteSpace(' ') PsiDeclarationStatement - PsiTypeElement:@Deprecated List - PsiAnnotation - PsiJavaToken:AT('@') - PsiJavaCodeReferenceElement:Deprecated - PsiIdentifier:Deprecated('Deprecated') - PsiReferenceParameterList - - PsiAnnotationParameterList - - PsiWhiteSpace(' ') + PsiTypeElement:List PsiJavaCodeReferenceElement:List PsiIdentifier:List('List') PsiReferenceParameterList