Drop suppport for annotation syntax without '@' from parser

This commit is contained in:
Valentin Kipyatkov
2015-10-10 16:42:58 +03:00
parent d8ba854036
commit 98dc8f234e
36 changed files with 940 additions and 1306 deletions
@@ -33,7 +33,6 @@ import java.util.Set;
import static org.jetbrains.kotlin.JetNodeTypes.*;
import static org.jetbrains.kotlin.lexer.JetTokens.*;
import static org.jetbrains.kotlin.parsing.JetParsing.AnnotationParsingMode.ALLOW_UNESCAPED_REGULAR_ANNOTATIONS;
import static org.jetbrains.kotlin.parsing.JetParsing.AnnotationParsingMode.ONLY_ESCAPED_REGULAR_ANNOTATIONS;
import static org.jetbrains.kotlin.parsing.JetParsing.DeclarationParsingMode.LOCAL;
@@ -846,14 +845,14 @@ public class JetExpressionParsing extends AbstractJetParsing {
if (at(LPAR)) {
advanceAt(LPAR);
int valPos = matchTokenStreamPredicate(new FirstBefore(new At(VAL_KEYWORD), new AtSet(RPAR, LBRACE, RBRACE, SEMICOLON, EQ)));
if (valPos >= 0) {
PsiBuilder.Marker property = mark();
myJetParsing.parseModifierList(ALLOW_UNESCAPED_REGULAR_ANNOTATIONS);
PsiBuilder.Marker property = mark();
myJetParsing.parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, TokenSet.create(EQ, RPAR));
if (at(VAL_KEYWORD) || at(VAR_KEYWORD)) {
myJetParsing.parseProperty(true);
property.done(PROPERTY);
}
else {
property.rollbackTo();
parseExpression();
}
@@ -1035,7 +1034,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
private boolean parseLocalDeclaration() {
PsiBuilder.Marker decl = mark();
JetParsing.ModifierDetector detector = new JetParsing.ModifierDetector();
myJetParsing.parseModifierList(detector, ONLY_ESCAPED_REGULAR_ANNOTATIONS);
myJetParsing.parseModifierList(detector, ONLY_ESCAPED_REGULAR_ANNOTATIONS, TokenSet.EMPTY);
IElementType declType = parseLocalDeclarationRest(detector.isEnumDetected());
@@ -1343,9 +1342,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
PsiBuilder.Marker parameter = mark();
if (!at(IN_KEYWORD)) {
myJetParsing.parseModifierListWithUnescapedAnnotations(
TokenSet.create(IDENTIFIER, LPAR), TokenSet.create(IN_KEYWORD, RPAR, COLON)
);
myJetParsing.parseModifierListWithLookForStopAt(TokenSet.create(IDENTIFIER, LPAR), TokenSet.create(IN_KEYWORD, RPAR, COLON));
}
if (at(VAL_KEYWORD) || at(VAR_KEYWORD)) advance(); // VAL_KEYWORD or VAR_KEYWORD
@@ -196,7 +196,7 @@ public class JetParsing extends AbstractJetParsing {
* ;
*/
PsiBuilder.Marker packageDirective = mark();
parseModifierList(ALLOW_UNESCAPED_REGULAR_ANNOTATIONS);
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, TokenSet.EMPTY);
if (at(PACKAGE_KEYWORD)) {
advance(); // PACKAGE_KEYWORD
@@ -391,7 +391,7 @@ public class JetParsing extends AbstractJetParsing {
PsiBuilder.Marker decl = mark();
ModifierDetector detector = new ModifierDetector();
parseModifierList(detector, ALLOW_UNESCAPED_REGULAR_ANNOTATIONS);
parseModifierList(detector, ONLY_ESCAPED_REGULAR_ANNOTATIONS, TokenSet.EMPTY);
IElementType keywordToken = tt();
IElementType declType = null;
@@ -434,9 +434,10 @@ public class JetParsing extends AbstractJetParsing {
* (modifier | annotation)*
*/
boolean parseModifierList(
@NotNull AnnotationParsingMode annotationParsingMode
@NotNull AnnotationParsingMode annotationParsingMode,
@Nullable TokenSet noModifiersBefore
) {
return parseModifierList(null, annotationParsingMode);
return parseModifierList(null, annotationParsingMode, noModifiersBefore);
}
/**
@@ -446,7 +447,8 @@ public class JetParsing extends AbstractJetParsing {
*/
boolean parseModifierList(
@Nullable Consumer<IElementType> tokenConsumer,
@NotNull AnnotationParsingMode annotationParsingMode
@NotNull AnnotationParsingMode annotationParsingMode,
@Nullable TokenSet noModifiersBefore
) {
PsiBuilder.Marker list = mark();
boolean empty = true;
@@ -458,7 +460,7 @@ public class JetParsing extends AbstractJetParsing {
if (at(AT) && annotationParsingMode.allowAnnotations) {
parseAnnotationOrList(annotationParsingMode);
}
else if (tryParseModifier(tokenConsumer)) {
else if (tryParseModifier(tokenConsumer, noModifiersBefore)) {
// modifier advanced
}
else if (annotationParsingMode.allowShortAnnotations && at(IDENTIFIER)) {
@@ -479,17 +481,20 @@ public class JetParsing extends AbstractJetParsing {
return !empty;
}
private boolean tryParseModifier(@Nullable Consumer<IElementType> tokenConsumer) {
private boolean tryParseModifier(@Nullable Consumer<IElementType> tokenConsumer, @Nullable TokenSet noModifiersBefore) {
PsiBuilder.Marker marker = mark();
if (atSet(MODIFIER_KEYWORDS)) {
IElementType tt = tt();
if (tokenConsumer != null) {
tokenConsumer.consume(tt);
IElementType lookahead = lookahead(1);
if (noModifiersBefore == null || lookahead != null && !noModifiersBefore.contains(lookahead)) {
IElementType tt = tt();
if (tokenConsumer != null) {
tokenConsumer.consume(tt);
}
advance(); // MODIFIER
marker.collapse(tt);
return true;
}
advance(); // MODIFIER
marker.collapse(tt);
return true;
}
marker.rollbackTo();
@@ -805,7 +810,8 @@ public class JetParsing extends AbstractJetParsing {
PsiBuilder.Marker beforeConstructorModifiers = mark();
PsiBuilder.Marker primaryConstructorMarker = mark();
boolean hasConstructorModifiers = parseModifierList(
declarationParsingMode != LOCAL ? PRIMARY_CONSTRUCTOR_MODIFIER_LIST : PRIMARY_CONSTRUCTOR_MODIFIER_LIST_LOCAL
declarationParsingMode != LOCAL ? PRIMARY_CONSTRUCTOR_MODIFIER_LIST : PRIMARY_CONSTRUCTOR_MODIFIER_LIST_LOCAL,
TokenSet.EMPTY
);
// Some modifiers found, but no parentheses following: class has already ended, and we are looking at something else
@@ -945,7 +951,7 @@ public class JetParsing extends AbstractJetParsing {
private ParseEnumEntryResult parseEnumEntry() {
PsiBuilder.Marker entry = mark();
parseModifierListWithStopAt(TokenSet.create(COMMA, SEMICOLON, RBRACE), ONLY_ESCAPED_REGULAR_ANNOTATIONS);
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, TokenSet.create(COMMA, COLON, SEMICOLON, RBRACE));
if (!atSet(SOFT_KEYWORDS_AT_MEMBER_START) && at(IDENTIFIER)) {
PsiBuilder.Marker nameAsDeclaration = mark();
@@ -1052,7 +1058,7 @@ public class JetParsing extends AbstractJetParsing {
PsiBuilder.Marker decl = mark();
ModifierDetector detector = new ModifierDetector();
parseModifierList(detector, ALLOW_UNESCAPED_REGULAR_ANNOTATIONS_AT_MEMBER_MODIFIER_LIST);
parseModifierList(detector, ALLOW_UNESCAPED_REGULAR_ANNOTATIONS_AT_MEMBER_MODIFIER_LIST, TokenSet.EMPTY);
IElementType declType = parseMemberDeclarationRest(detector.isEnumDetected(), detector.isDefaultDetected());
@@ -1177,33 +1183,6 @@ public class JetParsing extends AbstractJetParsing {
mark.done(CONSTRUCTOR_DELEGATION_REFERENCE);
}
/*
* initializer
* : annotations constructorInvocation // type parameters may (must?) be omitted
* ;
*/
private void parseInitializer() {
PsiBuilder.Marker initializer = mark();
parseAnnotations(ONLY_ESCAPED_REGULAR_ANNOTATIONS);
IElementType type;
if (atSet(TYPE_REF_FIRST)) {
PsiBuilder.Marker reference = mark();
parseTypeRef();
reference.done(CONSTRUCTOR_CALLEE);
type = DELEGATOR_SUPER_CALL;
}
else {
errorWithRecovery("Expecting constructor call (<class-name>(...))",
TokenSet.orSet(TOP_LEVEL_DECLARATION_FIRST, TokenSet.create(RBRACE, LBRACE, COMMA, SEMICOLON)));
initializer.drop();
return;
}
myExpressionParsing.parseValueArgumentList();
initializer.done(type);
}
/*
* typeAlias
* : modifiers "typealias" SimpleName (typeParameters typeConstraints)? "=" type
@@ -1248,12 +1227,8 @@ public class JetParsing extends AbstractJetParsing {
}
public IElementType parseProperty(boolean local) {
if (at(VAL_KEYWORD) || at(VAR_KEYWORD)) {
advance(); // VAL_KEYWORD or VAR_KEYWORD
}
else {
errorAndAdvance("Expecting 'val' or 'var'");
}
assert (at(VAL_KEYWORD) || at(VAR_KEYWORD));
advance();
boolean typeParametersDeclared = at(LT) && parseTypeParameterList(TokenSet.create(IDENTIFIER, EQ, COLON, SEMICOLON));
@@ -1359,7 +1334,7 @@ public class JetParsing extends AbstractJetParsing {
}
PsiBuilder.Marker property = mark();
parseModifierListWithUnescapedAnnotations(TokenSet.create(COMMA, RPAR, COLON, IN_KEYWORD, EQ));
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, TokenSet.create(COMMA, RPAR, COLON, IN_KEYWORD, EQ));
expect(IDENTIFIER, "Expecting a name", recoverySet);
@@ -1391,7 +1366,7 @@ public class JetParsing extends AbstractJetParsing {
private boolean parsePropertyGetterOrSetter() {
PsiBuilder.Marker getterOrSetter = mark();
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS);
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, TokenSet.EMPTY);
if (!at(GET_KEYWORD) && !at(SET_KEYWORD)) {
getterOrSetter.rollbackTo();
@@ -1418,7 +1393,7 @@ public class JetParsing extends AbstractJetParsing {
if (setter) {
PsiBuilder.Marker parameterList = mark();
PsiBuilder.Marker setterParameter = mark();
parseModifierListWithUnescapedAnnotations(TokenSet.create(RPAR, COMMA, COLON));
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, TokenSet.create(COMMA, COLON, RPAR));
expect(IDENTIFIER, "Expecting parameter name", TokenSet.create(RPAR, COLON, LBRACE, EQ));
if (at(COLON)) {
@@ -1804,7 +1779,7 @@ public class JetParsing extends AbstractJetParsing {
PsiBuilder.Marker mark = mark();
parseModifierListWithUnescapedAnnotations(TokenSet.create(COMMA, GT, COLON));
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, TokenSet.create(GT, COMMA, COLON));
expect(IDENTIFIER, "Type parameter name expected", TokenSet.EMPTY);
@@ -2085,7 +2060,7 @@ public class JetParsing extends AbstractJetParsing {
// TokenSet stopAt = TokenSet.create(COMMA, COLON, GT);
// parseModifierListWithUnescapedAnnotations(MODIFIER_LIST, lookFor, stopAt);
// Currently we do not allow annotations
parseModifierList(NO_ANNOTATIONS);
parseModifierList(NO_ANNOTATIONS, TokenSet.create(COMMA, COLON, GT));
if (at(MUL)) {
advance(); // MUL
@@ -2109,21 +2084,9 @@ public class JetParsing extends AbstractJetParsing {
return atGT;
}
public void parseModifierListWithUnescapedAnnotations(TokenSet stopAt) {
parseModifierListWithLookForStopAt(TokenSet.create(IDENTIFIER), stopAt, ALLOW_UNESCAPED_REGULAR_ANNOTATIONS);
}
public void parseModifierListWithStopAt(TokenSet stopAt, AnnotationParsingMode mode) {
parseModifierListWithLookForStopAt(TokenSet.create(IDENTIFIER), stopAt, mode);
}
public void parseModifierListWithUnescapedAnnotations(TokenSet lookFor, TokenSet stopAt) {
parseModifierListWithLookForStopAt(lookFor, stopAt, ALLOW_UNESCAPED_REGULAR_ANNOTATIONS);
}
public void parseModifierListWithLookForStopAt(TokenSet lookFor, TokenSet stopAt, AnnotationParsingMode mode) {
public void parseModifierListWithLookForStopAt(TokenSet lookFor, TokenSet stopAt) {
int lastId = matchTokenStreamPredicate(new LastBefore(new AtSet(lookFor), new AnnotationTargetStop(stopAt, ANNOTATION_TARGETS), false));
createTruncatedBuilder(lastId).parseModifierList(mode);
createTruncatedBuilder(lastId).parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, null);
}
private class AnnotationTargetStop extends AbstractTokenStreamPredicate {
@@ -2174,6 +2137,8 @@ public class JetParsing extends AbstractJetParsing {
return functionType;
}
private static final TokenSet NO_MODIFIER_BEFORE_FOR_VALUE_PARAMETER = TokenSet.create(COMMA, COLON, EQ, RPAR);
/*
* functionParameters
* : "(" functionParameter{","}? ")" // default values
@@ -2207,7 +2172,7 @@ public class JetParsing extends AbstractJetParsing {
if (isFunctionTypeContents) {
if (!tryParseValueParameter(typeRequired)) {
PsiBuilder.Marker valueParameter = mark();
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS); // lazy, out, ref
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, NO_MODIFIER_BEFORE_FOR_VALUE_PARAMETER); // lazy, out, ref
parseTypeRef();
closeDeclarationWithCommentBinders(valueParameter, VALUE_PARAMETER, false);
}
@@ -2248,7 +2213,7 @@ public class JetParsing extends AbstractJetParsing {
private boolean parseValueParameter(boolean rollbackOnFailure, boolean typeRequired) {
PsiBuilder.Marker parameter = mark();
parseModifierListWithUnescapedAnnotations(TokenSet.create(COMMA, RPAR));
parseModifierList(ONLY_ESCAPED_REGULAR_ANNOTATIONS, NO_MODIFIER_BEFORE_FOR_VALUE_PARAMETER);
if (at(VAR_KEYWORD) || at(VAL_KEYWORD)) {
advance(); // VAR_KEYWORD | VAL_KEYWORD
@@ -275,7 +275,7 @@ public class JetProperty extends JetTypeParameterListOwnerStub<KotlinPropertyStu
@NotNull
public PsiElement getValOrVarKeyword() {
PsiElement element = findChildByType(VAL_VAR_TOKEN_SET);
assert element != null : "Val or var should always exist for property";
assert element != null : "Val or var should always exist for property" + this.getText();
return element;
}