diff --git a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicOldExpressionParser.java b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicOldExpressionParser.java index 52bc8c5d3708..f210f2255895 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicOldExpressionParser.java +++ b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicOldExpressionParser.java @@ -916,14 +916,12 @@ public class BasicOldExpressionParser { PsiBuilder.Marker marker = builder.mark(); builder.advanceLexer(); BasicReferenceParser.TypeInfo typeInfo = myParser.getReferenceParser().parseTypeInfo( - builder, BasicReferenceParser.EAT_LAST_DOT | BasicReferenceParser.ELLIPSIS | BasicReferenceParser.WILDCARD); + builder, BasicReferenceParser.ELLIPSIS | BasicReferenceParser.WILDCARD); if (typeInfo != null) { IElementType t = builder.getTokenType(); - if (t == JavaTokenType.IDENTIFIER || - t == JavaTokenType.THIS_KEYWORD || - t == JavaTokenType.RPARENTH && builder.lookAhead(1) == JavaTokenType.ARROW) { - lambda = true; - } + lambda = t == JavaTokenType.IDENTIFIER || + t == JavaTokenType.THIS_KEYWORD || + t == JavaTokenType.RPARENTH && builder.lookAhead(1) == JavaTokenType.ARROW; } marker.rollbackTo(); diff --git a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicPrattExpressionParser.java b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicPrattExpressionParser.java index a5f9fe18b10d..d53ea1831a29 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicPrattExpressionParser.java +++ b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicPrattExpressionParser.java @@ -821,14 +821,12 @@ public class BasicPrattExpressionParser { PsiBuilder.Marker marker = builder.mark(); builder.advanceLexer(); BasicReferenceParser.TypeInfo typeInfo = myParser.getReferenceParser().parseTypeInfo( - builder, BasicReferenceParser.EAT_LAST_DOT | BasicReferenceParser.ELLIPSIS | BasicReferenceParser.WILDCARD); + builder, BasicReferenceParser.ELLIPSIS | BasicReferenceParser.WILDCARD); if (typeInfo != null) { IElementType t = builder.getTokenType(); - if (t == JavaTokenType.IDENTIFIER || - t == JavaTokenType.THIS_KEYWORD || - t == JavaTokenType.RPARENTH && builder.lookAhead(1) == JavaTokenType.ARROW) { - lambda = true; - } + lambda = t == JavaTokenType.IDENTIFIER || + t == JavaTokenType.THIS_KEYWORD || + t == JavaTokenType.RPARENTH && builder.lookAhead(1) == JavaTokenType.ARROW; } marker.rollbackTo(); diff --git a/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicExpressionParsingTest.java b/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicExpressionParsingTest.java index 340898538a3b..f4d25b9dcf07 100644 --- a/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicExpressionParsingTest.java +++ b/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicExpressionParsingTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.java.parser; import org.jetbrains.annotations.NotNull; @@ -9,146 +9,95 @@ public abstract class AbstractBasicExpressionParsingTest extends AbstractBasicJa } public void testAssignment0() { doTest(true); } - public void testAssignment1() { doTest(true); } public void testCond0() { doTest(true); } - public void testCond1() { doTest(true); } - public void testCond2() { doTest(true); } - public void testCond3() { doTest(true); } public void testCondOr0() { doTest(true); } - public void testCondOr1() { doTest(true); } public void testCondAnd0() { doTest(true); } - public void testCondAnd1() { doTest(true); } public void testOr0() { doTest(true); } - public void testOr1() { doTest(true); } public void testXor0() { doTest(true); } - public void testXor1() { doTest(true); } public void testAnd0() { doTest(true); } - public void testAnd1() { doTest(true); } public void testInstanceOf0() { doTest(true); } - public void testInstanceOf1() { doTest(true); } public void testNot0() { doTest(true); } - public void testNot1() { doTest(true); } public void testCast0() { doTest(true); } public void testParenth() { doTest(true); } - public void testParenth1() { doTest(true); } public void testNewInExprList() { doTest(true); } public void testNew0() { doTest(true); } - public void testNew1() { doTest(true); } - public void testNew2() { doTest(true); } - public void testNew3() { doTest(true); } - public void testNew4() { doTest(true); } - public void testNew5() { doTest(true); } - public void testNew6() { doTest(true); } - public void testNew7() { doTest(true); } - public void testNew8() { doTest(true); } - public void testNew9() { doTest(true); } - public void testNew10() { doTest(true); } - public void testNew11() { doTest(true); } - public void testNew12() { doTest(true); } - public void testNew13() { doTest(true); } - public void testNew14() { doTest(true); } - public void testNew15() { doTest(true); } public void testExprList0() { doTest(true); } - public void testExprList1() { doTest(true); } - public void testExprList2() { doTest(true); } - public void testExprList3() { doTest(true); } - public void testExprList4() { doTest(true); } - public void testExprList5() { doTest(true); } - public void testExprList6() { doTest(true); } public void testArrayInitializer0() { doTest(true); } - public void testArrayInitializer1() { doTest(true); } - public void testArrayInitializer2() { doTest(true); } - public void testArrayInitializer3() { doTest(true); } - public void testArrayInitializer4() { doTest(true); } - public void testArrayInitializer5() { doTest(true); } - public void testArrayInitializer6() { doTest(true); } - public void testArrayInitializer7() { doTest(true); } public void testPinesInReferenceExpression0() { doTest(true); } - public void testPinesInReferenceExpression1() { doTest(true); } public void testGE() { doTest(true); } - public void testIncompleteCast() { doTest(true); } - public void testShiftRight() { doTest(true); } - public void testAnonymousErrors() { doTest(true); } - public void testAnonymousErrors1() { doTest(true); } - public void testAnonymousWithTypeParams() { doTest(true); } - public void testAnonymous2() { doTest(true); } - public void testIncompleteDecl() { doTest(true); } + public void testLambdaConfusion() { doTest(true); } public void testIllegalWildcard() { doTest(true); } public void testQualifiedSuperMethodCall() { doTest(true); } - public void testQualifiedSuperMethodCall1() { doTest(true); } - public void testSuperMethodCallTypeParameterList() { doTest(true); } public void testPrimitiveClassObjectAccess() { doTest(true); } - public void testPrimitiveClassObjectAccessError() { doTest(true); } - public void testPrimitiveArrayClassObjectAccessError() { doTest(true); } } \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/expressionParsing/LambdaConfusion.java b/java/java-tests/testData/psi/parser-full/expressionParsing/LambdaConfusion.java new file mode 100644 index 000000000000..a0d92730f270 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/expressionParsing/LambdaConfusion.java @@ -0,0 +1,16 @@ +class X { + private int foo(Runnable r) { + return 1; + } + + public int boo(int a) { + return a; + } + + public class Inner { + public void run() { + int a = ((X.this.boo(foo(() -> { + })))); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/expressionParsing/LambdaConfusion.txt b/java/java-tests/testData/psi/parser-full/expressionParsing/LambdaConfusion.txt new file mode 100644 index 000000000000..aa4189760faf --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/expressionParsing/LambdaConfusion.txt @@ -0,0 +1,191 @@ +PsiJavaFile:LambdaConfusion.java + PsiImportList + + PsiClass:X + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:X('X') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiMethod:foo + PsiModifierList:private + PsiKeyword:private('private') + PsiTypeParameterList + + PsiWhiteSpace(' ') + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:foo('foo') + PsiParameterList:(Runnable r) + PsiJavaToken:LPARENTH('(') + PsiParameter:r + PsiModifierList: + + PsiTypeElement:Runnable + PsiJavaCodeReferenceElement:Runnable + PsiIdentifier:Runnable('Runnable') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:r('r') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiReturnStatement + PsiKeyword:return('return') + PsiWhiteSpace(' ') + PsiLiteralExpression:1 + PsiJavaToken:INTEGER_LITERAL('1') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n\n ') + PsiMethod:boo + PsiModifierList:public + PsiKeyword:public('public') + PsiTypeParameterList + + PsiWhiteSpace(' ') + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:boo('boo') + PsiParameterList:(int a) + PsiJavaToken:LPARENTH('(') + PsiParameter:a + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:a('a') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiReturnStatement + PsiKeyword:return('return') + PsiWhiteSpace(' ') + PsiReferenceExpression:a + PsiReferenceParameterList + + PsiIdentifier:a('a') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n\n ') + PsiClass:Inner + PsiModifierList:public + PsiKeyword:public('public') + PsiWhiteSpace(' ') + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:Inner('Inner') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiMethod:run + PsiModifierList:public + PsiKeyword:public('public') + PsiTypeParameterList + + PsiWhiteSpace(' ') + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:run('run') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiDeclarationStatement + PsiLocalVariable:a + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:a('a') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiParenthesizedExpression:((X.this.boo(foo(() -> { + })))) + PsiJavaToken:LPARENTH('(') + PsiParenthesizedExpression:(X.this.boo(foo(() -> { + }))) + PsiJavaToken:LPARENTH('(') + PsiMethodCallExpression:X.this.boo(foo(() -> { + })) + PsiReferenceExpression:X.this.boo + PsiThisExpression:X.this + PsiJavaCodeReferenceElement:X + PsiIdentifier:X('X') + PsiReferenceParameterList + + PsiJavaToken:DOT('.') + PsiKeyword:this('this') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:boo('boo') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiMethodCallExpression:foo(() -> { + }) + PsiReferenceExpression:foo + PsiReferenceParameterList + + PsiIdentifier:foo('foo') + PsiExpressionList + PsiJavaToken:LPARENTH('(') + PsiLambdaExpression + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiJavaToken:ARROW('->') + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:RPARENTH(')') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/expressionParsing/LambdaConfusion_node.txt b/java/java-tests/testData/psi/parser-full/expressionParsing/LambdaConfusion_node.txt new file mode 100644 index 000000000000..d6458b4ed718 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/expressionParsing/LambdaConfusion_node.txt @@ -0,0 +1,187 @@ +java.FILE + IMPORT_LIST + + CLASS + MODIFIER_LIST + + CLASS_KEYWORD + WHITE_SPACE + IDENTIFIER + TYPE_PARAMETER_LIST + + EXTENDS_LIST + + IMPLEMENTS_LIST + + WHITE_SPACE + LBRACE + WHITE_SPACE + METHOD + MODIFIER_LIST + PRIVATE_KEYWORD + TYPE_PARAMETER_LIST + + WHITE_SPACE + TYPE + INT_KEYWORD + WHITE_SPACE + IDENTIFIER + PARAMETER_LIST + LPARENTH + PARAMETER + MODIFIER_LIST + + TYPE + JAVA_CODE_REFERENCE + IDENTIFIER + REFERENCE_PARAMETER_LIST + + WHITE_SPACE + IDENTIFIER + RPARENTH + THROWS_LIST + + WHITE_SPACE + CODE_BLOCK + LBRACE + WHITE_SPACE + RETURN_STATEMENT + RETURN_KEYWORD + WHITE_SPACE + LITERAL_EXPRESSION + INTEGER_LITERAL + SEMICOLON + WHITE_SPACE + RBRACE + WHITE_SPACE + METHOD + MODIFIER_LIST + PUBLIC_KEYWORD + TYPE_PARAMETER_LIST + + WHITE_SPACE + TYPE + INT_KEYWORD + WHITE_SPACE + IDENTIFIER + PARAMETER_LIST + LPARENTH + PARAMETER + MODIFIER_LIST + + TYPE + INT_KEYWORD + WHITE_SPACE + IDENTIFIER + RPARENTH + THROWS_LIST + + WHITE_SPACE + CODE_BLOCK + LBRACE + WHITE_SPACE + RETURN_STATEMENT + RETURN_KEYWORD + WHITE_SPACE + REFERENCE_EXPRESSION + REFERENCE_PARAMETER_LIST + + IDENTIFIER + SEMICOLON + WHITE_SPACE + RBRACE + WHITE_SPACE + CLASS + MODIFIER_LIST + PUBLIC_KEYWORD + WHITE_SPACE + CLASS_KEYWORD + WHITE_SPACE + IDENTIFIER + TYPE_PARAMETER_LIST + + EXTENDS_LIST + + IMPLEMENTS_LIST + + WHITE_SPACE + LBRACE + WHITE_SPACE + METHOD + MODIFIER_LIST + PUBLIC_KEYWORD + TYPE_PARAMETER_LIST + + WHITE_SPACE + TYPE + VOID_KEYWORD + WHITE_SPACE + IDENTIFIER + PARAMETER_LIST + LPARENTH + RPARENTH + THROWS_LIST + + WHITE_SPACE + CODE_BLOCK + LBRACE + WHITE_SPACE + DECLARATION_STATEMENT + LOCAL_VARIABLE + MODIFIER_LIST + + TYPE + INT_KEYWORD + WHITE_SPACE + IDENTIFIER + WHITE_SPACE + EQ + WHITE_SPACE + PARENTH_EXPRESSION + LPARENTH + PARENTH_EXPRESSION + LPARENTH + METHOD_CALL_EXPRESSION + REFERENCE_EXPRESSION + THIS_EXPRESSION + JAVA_CODE_REFERENCE + IDENTIFIER + REFERENCE_PARAMETER_LIST + + DOT + THIS_KEYWORD + DOT + REFERENCE_PARAMETER_LIST + + IDENTIFIER + EXPRESSION_LIST + LPARENTH + METHOD_CALL_EXPRESSION + REFERENCE_EXPRESSION + REFERENCE_PARAMETER_LIST + + IDENTIFIER + EXPRESSION_LIST + LPARENTH + LAMBDA_EXPRESSION + PARAMETER_LIST + LPARENTH + RPARENTH + WHITE_SPACE + ARROW + WHITE_SPACE + CODE_BLOCK + LBRACE + WHITE_SPACE + RBRACE + RPARENTH + RPARENTH + RPARENTH + RPARENTH + SEMICOLON + WHITE_SPACE + RBRACE + WHITE_SPACE + RBRACE + WHITE_SPACE + RBRACE \ No newline at end of file