From 26313ece9766dcfe66a8ce1b8bc9ad6beaf99561 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 11 Nov 2016 18:22:09 +0100 Subject: [PATCH] [java] fixes lambda expressions parsing (IDEA-163871) --- .../lang/java/parser/ExpressionParser.java | 2 +- .../expressions/LambdaExpression23.txt | 29 +++++++++++++++++++ .../parser/partial/ExpressionParserTest.java | 1 + 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression23.txt 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 2ac9a064dbb1..5690638c55ea 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 @@ -848,7 +848,7 @@ public class ExpressionParser { PsiBuilder.Marker marker = builder.mark(); builder.advanceLexer(); ReferenceParser.TypeInfo typeInfo = myParser.getReferenceParser().parseTypeInfo( - builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.WILDCARD); + builder, ReferenceParser.EAT_LAST_DOT | ReferenceParser.ELLIPSIS | ReferenceParser.WILDCARD); if (typeInfo != null) { IElementType t = builder.getTokenType(); if (t == JavaTokenType.IDENTIFIER || diff --git a/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression23.txt b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression23.txt new file mode 100644 index 000000000000..31e6e354ee91 --- /dev/null +++ b/java/java-tests/testData/psi/parser-partial/expressions/LambdaExpression23.txt @@ -0,0 +1,29 @@ +PsiJavaFile:LambdaExpression23.java + PsiLambdaExpression + PsiParameterList:(T... t) + PsiJavaToken:LPARENTH('(') + PsiParameter:t + PsiModifierList: + + PsiTypeElement:T... + PsiTypeElement:T + PsiJavaCodeReferenceElement:T + PsiIdentifier:T('T') + PsiReferenceParameterList + + PsiJavaToken:ELLIPSIS('...') + PsiWhiteSpace(' ') + PsiIdentifier:t('t') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiJavaToken:ARROW('->') + PsiWhiteSpace(' ') + PsiReferenceExpression:t.length + PsiReferenceExpression:t + PsiReferenceParameterList + + PsiIdentifier:t('t') + PsiJavaToken:DOT('.') + PsiReferenceParameterList + + PsiIdentifier:length('length') \ 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 6e9317499198..11b58be4e142 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 @@ -151,6 +151,7 @@ public class ExpressionParserTest extends JavaParsingTestCase { public void testLambdaExpression20() { doParserTest("(@A T) -> (null)"); } public void testLambdaExpression21() { doParserTest("(T @A() [] x) -> { }"); } public void testLambdaExpression22() { doParserTest("(T x @A() []) -> { }"); } + public void testLambdaExpression23() { doParserTest("(T... t) -> t.length"); } public void testAmbiguousLambdaExpression() { doParserTest("f( (x) < y , z > (w) -> v )"); } private void doParserTest(String text) { -- 2.32.0