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 94d50c454349..c74f80356438 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 @@ -216,7 +216,7 @@ public class ExpressionParser { } final PsiBuilder.Marker expression = left.precede(); - builder.advanceLexer(); + advanceGtToken(builder, tokenType); final PsiBuilder.Marker right = parseExpression(builder, toParse); if (right == null) { @@ -801,6 +801,9 @@ public class ExpressionParser { tokenType = JavaTokenType.GTGT; } } + else if (builder.getTokenType() == JavaTokenType.EQ) { + tokenType = JavaTokenType.GE; + } } sp.rollbackTo(); @@ -822,6 +825,9 @@ public class ExpressionParser { else if (type == JavaTokenType.GTGT) { PsiBuilderUtil.advance(builder, 2); } + else if (type == JavaTokenType.GE) { + PsiBuilderUtil.advance(builder, 2); + } else { gtToken.drop(); builder.advanceLexer(); diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/field/ComplexInitializer.java b/java/java-tests/testData/psi/parser-full/declarationParsing/field/ComplexInitializer.java new file mode 100644 index 000000000000..a95028a0f402 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/field/ComplexInitializer.java @@ -0,0 +1,3 @@ +public class SystemInfo { + public static final boolean isKDE = SUN_DESKTOP != null && SUN_DESKTOP.toLowerCase().indexOf("kde") >= 0; +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/field/ComplexInitializer.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/field/ComplexInitializer.txt new file mode 100644 index 000000000000..533de56a0530 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/field/ComplexInitializer.txt @@ -0,0 +1,81 @@ +PsiJavaFile:ComplexInitializer.java + PsiImportList + + PsiClass:SystemInfo + PsiModifierList:public + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:SystemInfo('SystemInfo') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiField:isKDE + PsiModifierList:public static final + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiKeyword:static('static') + PsiWhiteSpace(' ') + PsiKeyword:final('final') + PsiWhiteSpace(' ') + PsiTypeElement:boolean + PsiKeyword:boolean('boolean') + PsiWhiteSpace(' ') + PsiIdentifier:isKDE('isKDE') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiBinaryExpression:SUN_DESKTOP != null && SUN_DESKTOP.toLowerCase().indexOf("kde") >= 0 + PsiBinaryExpression:SUN_DESKTOP != null + PsiReferenceExpression:SUN_DESKTOP + PsiReferenceParameterList + + PsiIdentifier:SUN_DESKTOP('SUN_DESKTOP') + PsiWhiteSpace(' ') + PsiJavaToken:NE('!=') + PsiWhiteSpace(' ') + PsiLiteralExpression:null + PsiJavaToken:NULL_KEYWORD('null') + PsiWhiteSpace(' ') + PsiJavaToken:ANDAND('&&') + PsiWhiteSpace(' ') + PsiBinaryExpression:SUN_DESKTOP.toLowerCase().indexOf("kde") >= 0 + PsiMethodCallExpression:SUN_DESKTOP.toLowerCase().indexOf("kde") + PsiReferenceExpression:SUN_DESKTOP.toLowerCase().indexOf + PsiMethodCallExpression:SUN_DESKTOP.toLowerCase() + PsiReferenceExpression:SUN_DESKTOP.toLowerCase + PsiReferenceExpression:SUN_DESKTOP + PsiReferenceParameterList + + PsiIdentifier:SUN_DESKTOP('SUN_DESKTOP') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:toLowerCase('toLowerCase') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:indexOf('indexOf') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiLiteralExpression:"kde" + PsiJavaToken:STRING_LITERAL('"kde"') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiJavaToken:GE('>=') + PsiWhiteSpace(' ') + PsiLiteralExpression:0 + PsiJavaToken:INTEGER_LITERAL('0') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/expressions/GE.txt b/java/java-tests/testData/psi/parser-partial/expressions/GE0.txt similarity index 95% rename from java/java-tests/testData/psi/parser-partial/expressions/GE.txt rename to java/java-tests/testData/psi/parser-partial/expressions/GE0.txt index 08e3dce501a2..2445ed283fbf 100644 --- a/java/java-tests/testData/psi/parser-partial/expressions/GE.txt +++ b/java/java-tests/testData/psi/parser-partial/expressions/GE0.txt @@ -1,4 +1,4 @@ -PsiJavaFile:GE.java +PsiJavaFile:GE0.java PsiAssignmentExpression:x >>>= 8 >> 2 PsiReferenceExpression:x PsiReferenceParameterList diff --git a/java/java-tests/testData/psi/parser-partial/expressions/GE1.txt b/java/java-tests/testData/psi/parser-partial/expressions/GE1.txt new file mode 100644 index 000000000000..f931b4e49f85 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/GE1.txt @@ -0,0 +1,11 @@ +PsiJavaFile:GE1.java + PsiBinaryExpression:x >= 2 + PsiReferenceExpression:x + PsiReferenceParameterList + + PsiIdentifier:x('x') + PsiWhiteSpace(' ') + PsiJavaToken:GE('>=') + PsiWhiteSpace(' ') + PsiLiteralExpression:2 + PsiJavaToken:INTEGER_LITERAL('2') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/FieldParsingTest.java b/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/FieldParsingTest.java index 5e6015847e6e..938467bf6184 100644 --- a/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/FieldParsingTest.java +++ b/java/java-tests/testSrc/com/intellij/lang/java/parser/declarationParsing/FieldParsingTest.java @@ -19,4 +19,6 @@ public class FieldParsingTest extends JavaParsingTestCase { public void testMissingInitializerExpression() { doTest(true); } public void testMultiLineUnclosed() { doTest(true); } + + public void testComplexInitializer() { doTest(true); } } \ 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 ebf0ea55901f..fe8edea5dc46 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 @@ -88,7 +88,8 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testPinesInReferenceExpression0() { doParserTest("Collections.sort(null)"); } public void testPinesInReferenceExpression1() { doParserTest("this.sort(null)"); } - public void testGE() { doParserTest("x >>>= 8 >> 2"); } + public void testGE0() { doParserTest("x >>>= 8 >> 2"); } + public void testGE1() { doParserTest("x >= 2"); } public void testIncompleteCast() { doParserTest("f((ArrayList) )"); } public void testShiftRight() { doParserTest("x >>= 2"); }