Allow targeted annotations in parameter list

This commit is contained in:
Yan Zhulanow
2015-07-17 21:13:16 +03:00
parent 8e65ceefd0
commit 8741b2d083
@@ -2124,10 +2124,37 @@ public class JetParsing extends AbstractJetParsing {
}
public void parseModifierListWithUnescapedAnnotations(TokenSet lookFor, TokenSet stopAt) {
int lastId = findLastBefore(lookFor, stopAt, false);
int lastId = matchTokenStreamPredicate(new LastBefore(new AtSet(lookFor), new AnnotationTargetStop(stopAt, ANNOTATION_TARGETS), false));
createTruncatedBuilder(lastId).parseModifierList(ALLOW_UNESCAPED_REGULAR_ANNOTATIONS);
}
private class AnnotationTargetStop extends AbstractTokenStreamPredicate {
private final TokenSet stopAt;
private final TokenSet annotationTargets;
private IElementType previousToken;
private IElementType tokenBeforePrevious;
public AnnotationTargetStop(TokenSet stopAt, TokenSet annotationTargets) {
this.stopAt = stopAt;
this.annotationTargets = annotationTargets;
}
@Override
public boolean matching(boolean topLevel) {
if (atSet(stopAt)) return true;
if (at(COLON) && !(tokenBeforePrevious == AT && (previousToken == IDENTIFIER || annotationTargets.contains(previousToken)))) {
return true;
}
tokenBeforePrevious = previousToken;
previousToken = tt();
return false;
}
}
/*
* functionType
* : "(" (parameter | modifiers type){","}? ")" "->" type?
@@ -2223,7 +2250,7 @@ public class JetParsing extends AbstractJetParsing {
private boolean parseValueParameter(boolean rollbackOnFailure, boolean typeRequired) {
PsiBuilder.Marker parameter = mark();
parseModifierListWithUnescapedAnnotations(TokenSet.create(COMMA, RPAR, COLON));
parseModifierListWithUnescapedAnnotations(TokenSet.create(COMMA, RPAR));
if (at(VAR_KEYWORD) || at(VAL_KEYWORD)) {
advance(); // VAR_KEYWORD | VAL_KEYWORD