diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java index 17a2b207ee8..b9dec93f67a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java @@ -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