mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[java] fixes typed lambda expressions parsing (IDEA-157929)
This commit is contained in:
@@ -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('}')
|
||||
+1
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user