Do not try to lazy parse a block without opening bracket

It can consume the whole file in such case
which will result PsiBuilder going crazy

#KT-36191 fixed
This commit is contained in:
Ilya Kirillov
2020-04-15 20:00:32 +03:00
parent 4f9364f997
commit 1535873c07
6 changed files with 96 additions and 5 deletions
@@ -1804,20 +1804,23 @@ public class KotlinParsing extends AbstractKotlinParsing {
myBuilder.enableNewlines();
expect(LBRACE, "Expecting '{' to open a block");
boolean hasOpeningBrace = expect(LBRACE, "Expecting '{' to open a block");
boolean canCollapse = collapse && hasOpeningBrace;
if(collapse){
if (canCollapse) {
advanceBalancedBlock();
}else{
}
else {
myExpressionParsing.parseStatements();
expect(RBRACE, "Expecting '}'");
}
myBuilder.restoreNewlinesState();
if(collapse){
if (canCollapse) {
lazyBlock.collapse(BLOCK);
}else{
}
else {
lazyBlock.done(BLOCK);
}
}
@@ -0,0 +1,3 @@
fun foo() {
println("${try}")
}
@@ -0,0 +1,40 @@
KtFile: StringTemplateWithTryWithoutBlockInLongEntry.kt
PACKAGE_DIRECTIVE
<empty list>
IMPORT_LIST
<empty list>
FUN
PsiElement(fun)('fun')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foo')
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
BLOCK
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('println')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
VALUE_ARGUMENT
STRING_TEMPLATE
PsiElement(OPEN_QUOTE)('"')
LONG_STRING_TEMPLATE_ENTRY
PsiElement(LONG_TEMPLATE_ENTRY_START)('${')
TRY
PsiElement(try)('try')
BLOCK
PsiErrorElement:Expecting '{' to open a block
<empty list>
PsiErrorElement:Expecting an element
PsiElement(LONG_TEMPLATE_ENTRY_END)('}')
PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line)
PsiElement(CLOSING_QUOTE)('"')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
PsiErrorElement:Expecting 'catch' or 'finally'
<empty list>
@@ -0,0 +1,3 @@
fun foo() {
println("$try")
}
@@ -0,0 +1,32 @@
KtFile: StringTemplateWithTryWithoutBlockInShortEntry.kt
PACKAGE_DIRECTIVE
<empty list>
IMPORT_LIST
<empty list>
FUN
PsiElement(fun)('fun')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foo')
VALUE_PARAMETER_LIST
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
BLOCK
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('println')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
VALUE_ARGUMENT
STRING_TEMPLATE
PsiElement(OPEN_QUOTE)('"')
SHORT_STRING_TEMPLATE_ENTRY
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
PsiErrorElement:Keyword cannot be used as a reference
PsiElement(try)('try')
PsiElement(CLOSING_QUOTE)('"')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
@@ -2742,6 +2742,16 @@ public class ParsingTestGenerated extends AbstractParsingTest {
public void testRawStringsWithManyQuotes() throws Exception {
runTest("compiler/testData/psi/stringTemplates/RawStringsWithManyQuotes.kt");
}
@TestMetadata("StringTemplateWithTryWithoutBlockInLongEntry.kt")
public void testStringTemplateWithTryWithoutBlockInLongEntry() throws Exception {
runTest("compiler/testData/psi/stringTemplates/StringTemplateWithTryWithoutBlockInLongEntry.kt");
}
@TestMetadata("StringTemplateWithTryWithoutBlockInShortEntry.kt")
public void testStringTemplateWithTryWithoutBlockInShortEntry() throws Exception {
runTest("compiler/testData/psi/stringTemplates/StringTemplateWithTryWithoutBlockInShortEntry.kt");
}
}
}