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();
|
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();
|
advanceBalancedBlock();
|
||||||
}else{
|
}
|
||||||
|
else {
|
||||||
myExpressionParsing.parseStatements();
|
myExpressionParsing.parseStatements();
|
||||||
expect(RBRACE, "Expecting '}'");
|
expect(RBRACE, "Expecting '}'");
|
||||||
}
|
}
|
||||||
|
|
||||||
myBuilder.restoreNewlinesState();
|
myBuilder.restoreNewlinesState();
|
||||||
|
|
||||||
if(collapse){
|
if (canCollapse) {
|
||||||
lazyBlock.collapse(BLOCK);
|
lazyBlock.collapse(BLOCK);
|
||||||
}else{
|
}
|
||||||
|
else {
|
||||||
lazyBlock.done(BLOCK);
|
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 {
|
public void testRawStringsWithManyQuotes() throws Exception {
|
||||||
runTest("compiler/testData/psi/stringTemplates/RawStringsWithManyQuotes.kt");
|
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