More correct recovery after '.' in user type
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
+14
-23
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user