[java] fixes typed lambda expressions parsing (IDEA-157929)

This commit is contained in:
Roman Shevchenko
2016-06-28 17:42:20 +03:00
parent 880374b5f2
commit a9fd248583
3 changed files with 41 additions and 14 deletions
@@ -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();
@@ -0,0 +1,35 @@
PsiJavaFile:LambdaExpression22.java
PsiLambdaExpression:(T x @A() []) -> { }
PsiParameterList:(T x @A() [])
PsiJavaToken:LPARENTH('(')
PsiParameter:x
PsiModifierList:
<empty list>
PsiTypeElement:T
PsiJavaCodeReferenceElement:T
PsiIdentifier:T('T')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:x('x')
PsiWhiteSpace(' ')
PsiAnnotation
PsiJavaToken:AT('@')
PsiJavaCodeReferenceElement:A
PsiIdentifier:A('A')
PsiReferenceParameterList
<empty list>
PsiAnnotationParameterList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiJavaToken:LBRACKET('[')
PsiJavaToken:RBRACKET(']')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')
@@ -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) {