From 5f9dbd844432bd4ca1a451af8ac17739e5a558c8 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 29 Sep 2010 16:48:14 +0400 Subject: [PATCH] New Java parser: expression parsing fix --- .../lang/java/parser/ExpressionParser.java | 2 +- .../lang/java/parser/ReferenceParser.java | 15 +++++++-------- .../psi/parser-partial/expressions/Binary0.txt | 13 +++++++++++++ .../psi/parser-partial/expressions/Binary1.txt | 13 +++++++++++++ .../psi/parser-partial/expressions/Parenth3.txt | 16 ++++++++++++++++ .../parser/partial/ExpressionParserTest.java | 4 ++++ 6 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/psi/parser-partial/expressions/Binary0.txt create mode 100644 java/java-tests/testData/psi/parser-partial/expressions/Binary1.txt create mode 100644 java/java-tests/testData/psi/parser-partial/expressions/Parenth3.txt diff --git a/java/java-impl/src/com/intellij/lang/java/parser/ExpressionParser.java b/java/java-impl/src/com/intellij/lang/java/parser/ExpressionParser.java index ab0a85586bb1..713bde2f8a4f 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/ExpressionParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/ExpressionParser.java @@ -271,7 +271,7 @@ public class ExpressionParser { final PsiBuilder.Marker expr = parseUnary(builder); if (expr == null) { - if (!typeInfo.isParameterized) { + if (!typeInfo.isParameterized) { // cannot parse correct parenthesized expression after correct parameterized type typeCast.rollbackTo(); return parsePostfix(builder); } diff --git a/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java b/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java index 02a1d95be73f..baf996675c0e 100644 --- a/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java +++ b/java/java-impl/src/com/intellij/lang/java/parser/ReferenceParser.java @@ -179,8 +179,7 @@ public class ReferenceParser { } if (parameterList) { - typeInfo.isParameterized = (builder.getTokenType() == JavaTokenType.LT); - parseReferenceParameterList(builder, true, diamonds); + typeInfo.isParameterized = parseReferenceParameterList(builder, true, diamonds); } else { if (!isStaticImport || builder.getTokenType() == JavaTokenType.DOT) { @@ -229,8 +228,7 @@ public class ReferenceParser { } if (parameterList) { - typeInfo.isParameterized = (builder.getTokenType() == JavaTokenType.LT); - parseReferenceParameterList(builder, true, diamonds); + typeInfo.isParameterized = parseReferenceParameterList(builder, true, diamonds); } else if (!isStaticImport || builder.getTokenType() == JavaTokenType.DOT) { emptyElement(builder, JavaElementType.REFERENCE_PARAMETER_LIST); @@ -241,14 +239,14 @@ public class ReferenceParser { return refElement; } - @NotNull - public static PsiBuilder.Marker parseReferenceParameterList(final PsiBuilder builder, final boolean wildcard, final boolean diamonds) { + public static boolean parseReferenceParameterList(final PsiBuilder builder, final boolean wildcard, final boolean diamonds) { final PsiBuilder.Marker list = builder.mark(); if (!expect(builder, JavaTokenType.LT)) { list.done(JavaElementType.REFERENCE_PARAMETER_LIST); - return list; + return false; } + boolean isOk = true; while (true) { final PsiBuilder.Marker type = parseType(builder, true, wildcard, diamonds); if (type == null) { @@ -259,12 +257,13 @@ public class ReferenceParser { break; } else if (!expectOrError(builder, JavaTokenType.COMMA, JavaErrorMessages.message("expected.gt.or.comma"))) { + isOk = false; break; } } list.done(JavaElementType.REFERENCE_PARAMETER_LIST); - return list; + return isOk; } @NotNull diff --git a/java/java-tests/testData/psi/parser-partial/expressions/Binary0.txt b/java/java-tests/testData/psi/parser-partial/expressions/Binary0.txt new file mode 100644 index 000000000000..b85f5e6f53cf --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/Binary0.txt @@ -0,0 +1,13 @@ +PsiJavaFile:Binary0.java + PsiBinaryExpression:a + b + PsiReferenceExpression:a + PsiReferenceParameterList + + PsiIdentifier:a('a') + PsiWhiteSpace(' ') + PsiJavaToken:PLUS('+') + PsiWhiteSpace(' ') + PsiReferenceExpression:b + PsiReferenceParameterList + + PsiIdentifier:b('b') diff --git a/java/java-tests/testData/psi/parser-partial/expressions/Binary1.txt b/java/java-tests/testData/psi/parser-partial/expressions/Binary1.txt new file mode 100644 index 000000000000..01bdccc9198a --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/Binary1.txt @@ -0,0 +1,13 @@ +PsiJavaFile:Binary1.java + PsiBinaryExpression:a < b + PsiReferenceExpression:a + PsiReferenceParameterList + + PsiIdentifier:a('a') + PsiWhiteSpace(' ') + PsiJavaToken:LT('<') + PsiWhiteSpace(' ') + PsiReferenceExpression:b + PsiReferenceParameterList + + PsiIdentifier:b('b') diff --git a/java/java-tests/testData/psi/parser-partial/expressions/Parenth3.txt b/java/java-tests/testData/psi/parser-partial/expressions/Parenth3.txt new file mode 100644 index 000000000000..786cbee963a6 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/Parenth3.txt @@ -0,0 +1,16 @@ +PsiJavaFile:Parenth3.java + PsiParenthesizedExpression:(a < b) + PsiJavaToken:LPARENTH('(') + PsiBinaryExpression:a < b + PsiReferenceExpression:a + PsiReferenceParameterList + + PsiIdentifier:a('a') + PsiWhiteSpace(' ') + PsiJavaToken:LT('<') + PsiWhiteSpace(' ') + PsiReferenceExpression:b + PsiReferenceParameterList + + PsiIdentifier:b('b') + PsiJavaToken:RPARENTH(')') 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 0021ea390b2d..db3af8cac07c 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 @@ -28,6 +28,9 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testAssignment0() { doParserTest("a = 0"); } public void testAssignment1() { doParserTest("a ="); } + public void testBinary0() { doParserTest("a + b"); } + public void testBinary1() { doParserTest("a < b"); } + public void testCond0() { doParserTest("cond ? true : false"); } public void testCond1() { doParserTest("cond ?"); } public void testCond2() { doParserTest("cond ? true"); } @@ -50,6 +53,7 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testParenth0() { doParserTest("(c)"); } public void testParenth1() { doParserTest("(this).f--"); } public void testParenth2() { doParserTest("("); } + public void testParenth3() { doParserTest("(a < b)"); } public void testNewInExprList() { doParserTest("call(new)"); }