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 753c65fe4c33..d8fe55e36ad6 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 @@ -17,7 +17,6 @@ package com.intellij.lang.java.parser; import com.intellij.codeInsight.daemon.JavaErrorMessages; import com.intellij.lang.PsiBuilder; -import com.intellij.lang.PsiBuilderUtil; import com.intellij.lang.WhitespacesBinders; import com.intellij.psi.JavaTokenType; import com.intellij.psi.TokenType; @@ -28,9 +27,7 @@ import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static com.intellij.lang.PsiBuilderUtil.drop; -import static com.intellij.lang.PsiBuilderUtil.expect; -import static com.intellij.lang.PsiBuilderUtil.rollbackTo; +import static com.intellij.lang.PsiBuilderUtil.*; import static com.intellij.lang.java.parser.JavaParserUtil.*; public class ExpressionParser { @@ -617,8 +614,7 @@ public class ExpressionParser { final PsiBuilder.Marker arrayInit = builder.mark(); builder.advanceLexer(); - boolean expressionMissed = false; - PsiBuilder.Marker lastComma = null; + boolean first = true; while (true) { if (builder.getTokenType() == JavaTokenType.RBRACE) { builder.advanceLexer(); @@ -630,25 +626,22 @@ public class ExpressionParser { break; } - if (expressionMissed && lastComma != null) { - // before comma must be an expression - lastComma.precede().errorBefore(JavaErrorMessages.message("expected.expression"), lastComma); - lastComma.drop(); - lastComma = null; - } - - final PsiBuilder.Marker arg = parse(builder); - if (arg == null) { + if (parse(builder) == null) { if (builder.getTokenType() == JavaTokenType.COMMA) { - expressionMissed = true; - lastComma = builder.mark(); + if (first && builder.lookAhead(1) == JavaTokenType.RBRACE) { + advance(builder, 2); + break; + } + builder.error(JavaErrorMessages.message("expected.expression")); } - else { + else if (builder.getTokenType() != JavaTokenType.RBRACE) { error(builder, JavaErrorMessages.message("expected.rbrace")); break; } } + first = false; + final IElementType tokenType = builder.getTokenType(); if (tokenType == JavaTokenType.COMMA) { builder.advanceLexer(); @@ -658,10 +651,6 @@ public class ExpressionParser { } } - if (lastComma != null) { - lastComma.drop(); - } - arrayInit.done(JavaElementType.ARRAY_INITIALIZER_EXPRESSION); return arrayInit; } @@ -982,13 +971,13 @@ public class ExpressionParser { final PsiBuilder.Marker gtToken = builder.mark(); if (type == JavaTokenType.GTGTGTEQ) { - PsiBuilderUtil.advance(builder, 4); + advance(builder, 4); } else if (type == JavaTokenType.GTGTGT || type == JavaTokenType.GTGTEQ) { - PsiBuilderUtil.advance(builder, 3); + advance(builder, 3); } else if (type == JavaTokenType.GTGT || type == JavaTokenType.GE) { - PsiBuilderUtil.advance(builder, 2); + advance(builder, 2); } else { gtToken.drop(); @@ -998,4 +987,4 @@ public class ExpressionParser { gtToken.collapse(type); } -} +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer7.txt b/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer7.txt index c33132bf2ac7..c5401c4cf1cc 100644 --- a/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer7.txt +++ b/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer7.txt @@ -13,4 +13,4 @@ PsiJavaFile:ArrayInitializer7.java PsiLiteralExpression:7 PsiJavaToken:INTEGER_LITERAL('7') PsiWhiteSpace(' ') - PsiJavaToken:RBRACE('}') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer8.txt b/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer8.txt new file mode 100644 index 000000000000..27ee31439f2d --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer8.txt @@ -0,0 +1,17 @@ +PsiJavaFile:ArrayInitializer8.java + PsiArrayInitializerExpression:{ 8, , , } + PsiJavaToken:LBRACE('{') + PsiWhiteSpace(' ') + PsiLiteralExpression:8 + PsiJavaToken:INTEGER_LITERAL('8') + PsiJavaToken:COMMA(',') + PsiErrorElement:Expression expected + + PsiWhiteSpace(' ') + PsiJavaToken:COMMA(',') + PsiErrorElement:Expression expected + + PsiWhiteSpace(' ') + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer9.txt b/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer9.txt new file mode 100644 index 000000000000..a157b9411ae0 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/ArrayInitializer9.txt @@ -0,0 +1,12 @@ +PsiJavaFile:ArrayInitializer9.java + PsiArrayInitializerExpression:{ , 9 } + PsiJavaToken:LBRACE('{') + PsiErrorElement:Expression expected + + PsiWhiteSpace(' ') + PsiJavaToken:COMMA(',') + PsiWhiteSpace(' ') + PsiLiteralExpression:9 + PsiJavaToken:INTEGER_LITERAL('9') + PsiWhiteSpace(' ') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java index dc34fa3c3969..48a6863e1286 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/partial/ExpressionParserTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -93,6 +93,8 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testArrayInitializer5() { doParserTest("{ { }"); } public void testArrayInitializer6() { doParserTest("{ , }"); } public void testArrayInitializer7() { doParserTest("{ , , 7 }"); } + public void testArrayInitializer8() { doParserTest("{ 8, , , }"); } + public void testArrayInitializer9() { doParserTest("{ , 9 }"); } public void testPinesInReferenceExpression0() { doParserTest("Collections.sort(null)"); } public void testPinesInReferenceExpression1() { doParserTest("this.sort(null)"); }