Skip to content

Commit

Permalink
Do not try to lazy parse a block without opening bracket
Browse files Browse the repository at this point in the history
It can consume the whole file in such case
which will result PsiBuilder going crazy

#KT-36191 fixed
  • Loading branch information
darthorimar committed Apr 16, 2020
1 parent 4f9364f commit 1535873
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 5 deletions.
13 changes: 8 additions & 5 deletions compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinParsing.java
Original file line number Diff line number Diff line change
Expand Up @@ -1804,20 +1804,23 @@ private void parseBlock(boolean collapse) {

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);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fun foo() {
println("${try}")
}
Original file line number Diff line number Diff line change
@@ -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>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fun foo() {
println("$try")
}
Original file line number Diff line number Diff line change
@@ -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)('}')

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 1535873

Please sign in to comment.