More correct recovery after '.' in user type

This commit is contained in:
Valentin Kipyatkov
2015-05-15 16:33:15 +03:00
parent e4cf12f93e
commit 00fbf41bd8
2 changed files with 29 additions and 36 deletions
@@ -44,12 +44,14 @@ public class JetParsing extends AbstractJetParsing {
} }
} }
private static final TokenSet TOPLEVEL_OBJECT_FIRST = TokenSet.create(TYPE_ALIAS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD, CLASS_KEYWORD, private static final TokenSet TOP_LEVEL_DECLARATION_FIRST = TokenSet.create(
FUN_KEYWORD, VAL_KEYWORD, PACKAGE_KEYWORD); TYPE_ALIAS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD, CLASS_KEYWORD, OBJECT_KEYWORD,
private static final TokenSet ENUM_MEMBER_FIRST = TokenSet.create(TYPE_ALIAS_KEYWORD, TRAIT_KEYWORD, INTERFACE_KEYWORD, CLASS_KEYWORD, FUN_KEYWORD, VAL_KEYWORD, PACKAGE_KEYWORD);
FUN_KEYWORD, VAL_KEYWORD, LBRACE, IDENTIFIER, OBJECT_KEYWORD); private static final TokenSet DECLARATION_FIRST = TokenSet.orSet(TOP_LEVEL_DECLARATION_FIRST,
TokenSet.create(INIT_KEYWORD, GET_KEYWORD, SET_KEYWORD, CONSTRUCTOR_KEYWORD));
private static final TokenSet CLASS_NAME_RECOVERY_SET = TokenSet.orSet(TokenSet.create(LT, LPAR, COLON, LBRACE), TOPLEVEL_OBJECT_FIRST); private static final TokenSet CLASS_NAME_RECOVERY_SET = TokenSet.orSet(TokenSet.create(LT, LPAR, COLON, LBRACE),
TOP_LEVEL_DECLARATION_FIRST);
private static final TokenSet TYPE_PARAMETER_GT_RECOVERY_SET = TokenSet.create(WHERE_KEYWORD, LPAR, COLON, LBRACE, GT); private static final TokenSet TYPE_PARAMETER_GT_RECOVERY_SET = TokenSet.create(WHERE_KEYWORD, LPAR, COLON, LBRACE, GT);
private static final TokenSet PARAMETER_NAME_RECOVERY_SET = TokenSet.create(COLON, EQ, COMMA, RPAR); private static final TokenSet PARAMETER_NAME_RECOVERY_SET = TokenSet.create(COLON, EQ, COMMA, RPAR);
private static final TokenSet PACKAGE_NAME_RECOVERY_SET = TokenSet.create(DOT, EOL_OR_SEMICOLON); private static final TokenSet PACKAGE_NAME_RECOVERY_SET = TokenSet.create(DOT, EOL_OR_SEMICOLON);
@@ -105,7 +107,7 @@ public class JetParsing extends AbstractJetParsing {
parsePreamble(); parsePreamble();
while (!eof()) { while (!eof()) {
parseTopLevelObject(); parseTopLevelDeclaration();
} }
fileMarker.done(JET_FILE); fileMarker.done(JET_FILE);
@@ -368,7 +370,7 @@ public class JetParsing extends AbstractJetParsing {
* : object * : object
* ; * ;
*/ */
private void parseTopLevelObject() { private void parseTopLevelDeclaration() {
PsiBuilder.Marker decl = mark(); PsiBuilder.Marker decl = mark();
ModifierDetector detector = new ModifierDetector(); ModifierDetector detector = new ModifierDetector();
@@ -1085,7 +1087,7 @@ public class JetParsing extends AbstractJetParsing {
} }
else { else {
errorWithRecovery("Expecting constructor call (<class-name>(...))", errorWithRecovery("Expecting constructor call (<class-name>(...))",
TokenSet.orSet(TOPLEVEL_OBJECT_FIRST, TokenSet.create(RBRACE, LBRACE, COMMA, SEMICOLON))); TokenSet.orSet(TOP_LEVEL_DECLARATION_FIRST, TokenSet.create(RBRACE, LBRACE, COMMA, SEMICOLON)));
initializer.drop(); initializer.drop();
return; return;
} }
@@ -1104,13 +1106,13 @@ public class JetParsing extends AbstractJetParsing {
advance(); // TYPE_ALIAS_KEYWORD advance(); // TYPE_ALIAS_KEYWORD
expect(IDENTIFIER, "Type name expected", TokenSet.orSet(TokenSet.create(LT, EQ, SEMICOLON), TOPLEVEL_OBJECT_FIRST)); expect(IDENTIFIER, "Type name expected", TokenSet.orSet(TokenSet.create(LT, EQ, SEMICOLON), TOP_LEVEL_DECLARATION_FIRST));
if (parseTypeParameterList(TYPE_PARAMETER_GT_RECOVERY_SET)) { if (parseTypeParameterList(TYPE_PARAMETER_GT_RECOVERY_SET)) {
parseTypeConstraints(); parseTypeConstraints();
} }
expect(EQ, "Expecting '='", TokenSet.orSet(TOPLEVEL_OBJECT_FIRST, TokenSet.create(SEMICOLON))); expect(EQ, "Expecting '='", TokenSet.orSet(TOP_LEVEL_DECLARATION_FIRST, TokenSet.create(SEMICOLON)));
parseTypeRef(); parseTypeRef();
@@ -1474,7 +1476,7 @@ public class JetParsing extends AbstractJetParsing {
} }
private boolean definitelyOutOfReceiver() { private boolean definitelyOutOfReceiver() {
return atSet(EQ, COLON, LBRACE, RBRACE, BY_KEYWORD) || atSet(TOPLEVEL_OBJECT_FIRST); return atSet(EQ, COLON, LBRACE, RBRACE, BY_KEYWORD) || atSet(TOP_LEVEL_DECLARATION_FIRST);
} }
/* /*
@@ -1787,7 +1789,7 @@ public class JetParsing extends AbstractJetParsing {
} }
else { else {
errorWithRecovery("Type expected", errorWithRecovery("Type expected",
TokenSet.orSet(TOPLEVEL_OBJECT_FIRST, TokenSet.orSet(TOP_LEVEL_DECLARATION_FIRST,
TokenSet.create(EQ, COMMA, GT, RBRACKET, DOT, RPAR, RBRACE, LBRACE, SEMICOLON), extraRecoverySet)); TokenSet.create(EQ, COMMA, GT, RBRACKET, DOT, RPAR, RBRACE, LBRACE, SEMICOLON), extraRecoverySet));
} }
@@ -1853,7 +1855,7 @@ public class JetParsing extends AbstractJetParsing {
recoverOnParenthesizedWordForPlatformTypes(0, "Mutable", true); recoverOnParenthesizedWordForPlatformTypes(0, "Mutable", true);
if (expect(IDENTIFIER, "Expecting type name", if (expect(IDENTIFIER, "Expecting type name",
TokenSet.orSet(JetExpressionParsing.EXPRESSION_FIRST, JetExpressionParsing.EXPRESSION_FOLLOW))) { TokenSet.orSet(JetExpressionParsing.EXPRESSION_FIRST, JetExpressionParsing.EXPRESSION_FOLLOW, DECLARATION_FIRST))) {
reference.done(REFERENCE_EXPRESSION); reference.done(REFERENCE_EXPRESSION);
} }
else { else {
@@ -534,7 +534,7 @@ JetFile: FunctionsWithFunctionReceiversRecovery.kt
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')
PsiWhiteSpace('\n') PsiWhiteSpace('\n')
FUN CLASS
MODIFIER_LIST MODIFIER_LIST
ANNOTATION_ENTRY ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE CONSTRUCTOR_CALLEE
@@ -552,30 +552,21 @@ JetFile: FunctionsWithFunctionReceiversRecovery.kt
PsiElement(IDENTIFIER)('t') PsiElement(IDENTIFIER)('t')
PsiElement(GT)('>') PsiElement(GT)('>')
PsiElement(DOT)('.') PsiElement(DOT)('.')
PsiWhiteSpace('\n\n')
PsiComment(EOL_COMMENT)('//-----------')
PsiWhiteSpace('\n')
PsiErrorElement:Expecting type name PsiErrorElement:Expecting type name
PsiElement(class)('class') <empty list>
PsiWhiteSpace(' ') PsiWhiteSpace('\n\n')
ANNOTATION_ENTRY PsiComment(EOL_COMMENT)('//-----------')
CONSTRUCTOR_CALLEE PsiWhiteSpace('\n')
TYPE_REFERENCE PsiElement(class)('class')
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('A')
TYPE_ARGUMENT_LIST
PsiElement(LT)('<')
TYPE_PROJECTION
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('X')
PsiElement(GT)('>')
PsiErrorElement:Expecting a top level declaration
<empty list>
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
BLOCK PsiElement(IDENTIFIER)('A')
TYPE_PARAMETER_LIST
PsiElement(LT)('<')
TYPE_PARAMETER
PsiElement(IDENTIFIER)('X')
PsiElement(GT)('>')
PsiWhiteSpace(' ')
CLASS_BODY
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
FUN FUN