Better parsing of block after missing "->" after "else" in when

This commit is contained in:
Valentin Kipyatkov
2015-05-15 16:31:34 +03:00
parent 56c3f7b7db
commit c94dc6d5f7
2 changed files with 18 additions and 22 deletions
@@ -137,7 +137,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
TokenSet.create(EOL_OR_SEMICOLON)); TokenSet.create(EOL_OR_SEMICOLON));
/*package*/ static final TokenSet EXPRESSION_FOLLOW = TokenSet.create( /*package*/ static final TokenSet EXPRESSION_FOLLOW = TokenSet.create(
SEMICOLON, ARROW, COMMA, LBRACE, RBRACE, RPAR, RBRACKET SEMICOLON, ARROW, COMMA, RBRACE, RPAR, RBRACKET
); );
@SuppressWarnings({"UnusedDeclaration"}) @SuppressWarnings({"UnusedDeclaration"})
@@ -887,8 +887,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
advance(); // ELSE_KEYWORD advance(); // ELSE_KEYWORD
if (!at(ARROW)) { if (!at(ARROW)) {
errorUntil("Expecting '->'", TokenSet.create(ARROW, LBRACE, errorUntil("Expecting '->'", TokenSet.create(ARROW, LBRACE, RBRACE, EOL_OR_SEMICOLON));
RBRACE, EOL_OR_SEMICOLON));
} }
if (at(ARROW)) { if (at(ARROW)) {
@@ -901,7 +900,10 @@ public class JetExpressionParsing extends AbstractJetParsing {
parseExpressionPreferringBlocks(); parseExpressionPreferringBlocks();
} }
} }
else if (!atSet(WHEN_CONDITION_RECOVERY_SET) && !at(LBRACE)) { else if (at(LBRACE)) { // no arrow, probably it's simply missing
parseExpressionPreferringBlocks();
}
else if (!atSet(WHEN_CONDITION_RECOVERY_SET)) {
errorAndAdvance("Expecting '->'"); errorAndAdvance("Expecting '->'");
} }
} }
@@ -43,24 +43,18 @@ JetFile: IncompleteWhenElse.kt
PsiElement(else)('else') PsiElement(else)('else')
PsiErrorElement:Expecting '->' PsiErrorElement:Expecting '->'
<empty list> <empty list>
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
WHEN_ENTRY BLOCK
WHEN_CONDITION_WITH_EXPRESSION PsiElement(LBRACE)('{')
FUNCTION_LITERAL_EXPRESSION PsiWhiteSpace(' ')
FUNCTION_LITERAL CALL_EXPRESSION
PsiElement(LBRACE)('{') REFERENCE_EXPRESSION
PsiWhiteSpace(' ') PsiElement(IDENTIFIER)('doIt')
BLOCK VALUE_ARGUMENT_LIST
CALL_EXPRESSION PsiElement(LPAR)('(')
REFERENCE_EXPRESSION PsiElement(RPAR)(')')
PsiElement(IDENTIFIER)('doIt') PsiWhiteSpace(' ')
VALUE_ARGUMENT_LIST PsiElement(RBRACE)('}')
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(RBRACE)('}')
PsiErrorElement:Expecting '->'
<empty list>
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n ') PsiWhiteSpace('\n\n ')