From 131e77927a75b3938e665521ee6949e1fead25f4 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 9 Sep 2016 17:54:43 +0300 Subject: [PATCH] Skip lazy parsable lambdas without actually parsing them --- .../parsing/KotlinExpressionParsing.java | 36 ++++++++++++++----- .../testData/psi/annotation/lambdaRecovery.kt | 3 ++ .../psi/annotation/lambdaRecovery.txt | 19 +++++++++- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java index dd45361f1e5..df23daeb2f5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java @@ -1080,20 +1080,40 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { return; } - PsiBuilder.Marker body = mark(); - parseStatements(); - body.done(BLOCK); - - expect(RBRACE, "Expecting '}'"); - myBuilder.restoreNewlinesState(); - - literal.done(FUNCTION_LITERAL); if (collapse) { + advanceLambdaBlock(); + literal.done(FUNCTION_LITERAL); literalExpression.collapse(LAMBDA_EXPRESSION); } else { + PsiBuilder.Marker body = mark(); + parseStatements(); + body.done(BLOCK); + + expect(RBRACE, "Expecting '}'"); + literal.done(FUNCTION_LITERAL); 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) { diff --git a/compiler/testData/psi/annotation/lambdaRecovery.kt b/compiler/testData/psi/annotation/lambdaRecovery.kt index e3ef70804f3..72938491319 100644 --- a/compiler/testData/psi/annotation/lambdaRecovery.kt +++ b/compiler/testData/psi/annotation/lambdaRecovery.kt @@ -38,3 +38,6 @@ fun foo() { } } + +// No '}' +val test = { \ No newline at end of file diff --git a/compiler/testData/psi/annotation/lambdaRecovery.txt b/compiler/testData/psi/annotation/lambdaRecovery.txt index 271d2142cd0..4b8f9e9f659 100644 --- a/compiler/testData/psi/annotation/lambdaRecovery.txt +++ b/compiler/testData/psi/annotation/lambdaRecovery.txt @@ -309,4 +309,21 @@ JetFile: lambdaRecovery.kt PsiElement(RBRACE)('}') PsiWhiteSpace('\n') - PsiElement(RBRACE)('}') \ No newline at end of file + 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 + + PsiErrorElement:Expecting '}' + \ No newline at end of file