Skip lazy parsable lambdas without actually parsing them
This commit is contained in:
@@ -1080,20 +1080,40 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PsiBuilder.Marker body = mark();
|
|
||||||
parseStatements();
|
|
||||||
body.done(BLOCK);
|
|
||||||
|
|
||||||
expect(RBRACE, "Expecting '}'");
|
|
||||||
myBuilder.restoreNewlinesState();
|
|
||||||
|
|
||||||
literal.done(FUNCTION_LITERAL);
|
|
||||||
if (collapse) {
|
if (collapse) {
|
||||||
|
advanceLambdaBlock();
|
||||||
|
literal.done(FUNCTION_LITERAL);
|
||||||
literalExpression.collapse(LAMBDA_EXPRESSION);
|
literalExpression.collapse(LAMBDA_EXPRESSION);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
PsiBuilder.Marker body = mark();
|
||||||
|
parseStatements();
|
||||||
|
body.done(BLOCK);
|
||||||
|
|
||||||
|
expect(RBRACE, "Expecting '}'");
|
||||||
|
literal.done(FUNCTION_LITERAL);
|
||||||
literalExpression.done(LAMBDA_EXPRESSION);
|
literalExpression.done(LAMBDA_EXPRESSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
myBuilder.restoreNewlinesState();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void advanceLambdaBlock() {
|
||||||
|
int braceCount = 1;
|
||||||
|
while (!eof()) {
|
||||||
|
if (_at(LBRACE)) {
|
||||||
|
braceCount++;
|
||||||
|
}
|
||||||
|
else if (_at(RBRACE)) {
|
||||||
|
braceCount--;
|
||||||
|
}
|
||||||
|
|
||||||
|
advance();
|
||||||
|
|
||||||
|
if (braceCount == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean rollbackOrDropAt(PsiBuilder.Marker rollbackMarker, IElementType dropAt) {
|
private boolean rollbackOrDropAt(PsiBuilder.Marker rollbackMarker, IElementType dropAt) {
|
||||||
|
|||||||
@@ -38,3 +38,6 @@ fun foo() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No '}'
|
||||||
|
val test = {
|
||||||
+18
-1
@@ -309,4 +309,21 @@ JetFile: lambdaRecovery.kt
|
|||||||
<empty list>
|
<empty list>
|
||||||
PsiElement(RBRACE)('}')
|
PsiElement(RBRACE)('}')
|
||||||
PsiWhiteSpace('\n')
|
PsiWhiteSpace('\n')
|
||||||
PsiElement(RBRACE)('}')
|
PsiElement(RBRACE)('}')
|
||||||
|
PsiWhiteSpace('\n\n')
|
||||||
|
PROPERTY
|
||||||
|
PsiComment(EOL_COMMENT)('// No '}'')
|
||||||
|
PsiWhiteSpace('\n')
|
||||||
|
PsiElement(val)('val')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(IDENTIFIER)('test')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(EQ)('=')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
LAMBDA_EXPRESSION
|
||||||
|
FUNCTION_LITERAL
|
||||||
|
PsiElement(LBRACE)('{')
|
||||||
|
BLOCK
|
||||||
|
<empty list>
|
||||||
|
PsiErrorElement:Expecting '}'
|
||||||
|
<empty list>
|
||||||
Reference in New Issue
Block a user