Skip lazy parsable lambdas without actually parsing them

This commit is contained in:
Nikolay Krasko
2016-09-09 17:54:43 +03:00
parent c91f77f2a4
commit 131e77927a
3 changed files with 49 additions and 9 deletions
@@ -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) {
+3
View File
@@ -38,3 +38,6 @@ fun foo() {
} }
} }
// No '}'
val test = {
+18 -1
View File
@@ -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>