[java] fixes lambda expressions parsing (IDEA-163871)

This commit is contained in:
Roman Shevchenko
2016-11-11 18:22:32 +01:00
parent e668646e0e
commit 26313ece97
3 changed files with 31 additions and 1 deletions
@@ -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 ||
@@ -0,0 +1,29 @@
PsiJavaFile:LambdaExpression23.java
PsiLambdaExpression
PsiParameterList:(T... t)
PsiJavaToken:LPARENTH('(')
PsiParameter:t
PsiModifierList:
<empty list>
PsiTypeElement:T...
PsiTypeElement:T
PsiJavaCodeReferenceElement:T
PsiIdentifier:T('T')
PsiReferenceParameterList
<empty list>
PsiJavaToken:ELLIPSIS('...')
PsiWhiteSpace(' ')
PsiIdentifier:t('t')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')
PsiReferenceExpression:t.length
PsiReferenceExpression:t
PsiReferenceParameterList
<empty list>
PsiIdentifier:t('t')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:length('length')
@@ -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) {