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 83ebe0485f77..2ac9a064dbb1 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 @@ -850,20 +850,11 @@ public class ExpressionParser { ReferenceParser.TypeInfo typeInfo = myParser.getReferenceParser().parseTypeInfo( builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.WILDCARD); if (typeInfo != null) { - while (!builder.eof()) { - IElementType t = builder.getTokenType(); - if (t == JavaTokenType.COMMA || t == JavaTokenType.ARROW) { - lambda = true; - break; - } - if (t == JavaTokenType.RPARENTH) { - lambda = builder.lookAhead(1) == JavaTokenType.ARROW; - break; - } - else if (t == JavaTokenType.LPARENTH || t == JavaTokenType.SEMICOLON || t == JavaTokenType.LBRACE || t == JavaTokenType.RBRACE) { - break; - } - builder.advanceLexer(); + IElementType t = builder.getTokenType(); + if (t == JavaTokenType.IDENTIFIER || + t == JavaTokenType.THIS_KEYWORD || + t == JavaTokenType.RPARENTH && builder.lookAhead(1) == JavaTokenType.ARROW) { + lambda = true; } } marker.rollbackTo(); diff --git a/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression22.txt b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression22.txt new file mode 100644 index 000000000000..ae2326c6b59b --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression22.txt @@ -0,0 +1,35 @@ +PsiJavaFile:LambdaExpression22.java + PsiLambdaExpression:(T x @A() []) -> { } + PsiParameterList:(T x @A() []) + PsiJavaToken:LPARENTH('(') + PsiParameter:x + PsiModifierList: + + PsiTypeElement:T + PsiJavaCodeReferenceElement:T + PsiIdentifier:T('T') + PsiReferenceParameterList + + PsiWhiteSpace(' ') + PsiIdentifier:x('x') + PsiWhiteSpace(' ') + PsiAnnotation + PsiJavaToken:AT('@') + PsiJavaCodeReferenceElement:A + PsiIdentifier:A('A') + PsiReferenceParameterList + + PsiAnnotationParameterList + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiJavaToken:LBRACKET('[') + PsiJavaToken:RBRACKET(']') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiJavaToken:ARROW('->') + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + 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 d430a545e1a7..6e9317499198 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 @@ -150,6 +150,7 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testLambdaExpression19() { doParserTest("(@A T t) -> (null)"); } public void testLambdaExpression20() { doParserTest("(@A T) -> (null)"); } public void testLambdaExpression21() { doParserTest("(T @A() [] x) -> { }"); } + public void testLambdaExpression22() { doParserTest("(T x @A() []) -> { }"); } public void testAmbiguousLambdaExpression() { doParserTest("f( (x) < y , z > (w) -> v )"); } private void doParserTest(String text) {