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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fun foo() {
|
||||
println("${try}")
|
||||
}
|
||||
+40
@@ -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>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fun foo() {
|
||||
println("$try")
|
||||
}
|
||||
+32
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user