From 1010658a85279545e2f1916328affad3613d36d4 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 16 Jul 2015 17:17:08 +0300 Subject: [PATCH] Parse other use-site targeted annotations --- .../org/jetbrains/kotlin/lexer/JetTokens.java | 6 +- .../jetbrains/kotlin/parsing/JetParsing.java | 15 +- compiler/testData/psi/SoftKeywords.kt | 20 ++ compiler/testData/psi/SoftKeywords.txt | 215 ++++++++++++++++++ grammar/src/attributes.grm | 12 +- 5 files changed, 264 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java b/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java index 6e5006a80b6..36b658ea0b5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/lexer/JetTokens.java @@ -134,6 +134,10 @@ public interface JetTokens { JetToken EOL_OR_SEMICOLON = new JetToken("EOL_OR_SEMICOLON"); JetKeywordToken FILE_KEYWORD = JetKeywordToken.softKeyword("file"); JetKeywordToken FIELD_KEYWORD = JetKeywordToken.softKeyword("field"); + JetKeywordToken PROPERTY_KEYWORD = JetKeywordToken.softKeyword("property"); + JetKeywordToken RECEIVER_KEYWORD = JetKeywordToken.softKeyword("receiver"); + JetKeywordToken PARAM_KEYWORD = JetKeywordToken.softKeyword("param"); + JetKeywordToken SPARAM_KEYWORD = JetKeywordToken.softKeyword("sparam"); JetKeywordToken IMPORT_KEYWORD = JetKeywordToken.softKeyword("import"); JetKeywordToken WHERE_KEYWORD = JetKeywordToken.softKeyword("where"); JetKeywordToken BY_KEYWORD = JetKeywordToken.softKeyword("by"); @@ -176,7 +180,7 @@ public interface JetTokens { OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD, DYNAMIC_KEYWORD, COMPANION_KEYWORD, CONSTRUCTOR_KEYWORD, INIT_KEYWORD, SEALED_KEYWORD, - FIELD_KEYWORD + FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD ); /* diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java index 823a9ee4b2d..17a2b207ee8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/JetParsing.java @@ -64,7 +64,8 @@ public class JetParsing extends AbstractJetParsing { private static final TokenSet LAMBDA_VALUE_PARAMETER_FIRST = TokenSet.orSet(TokenSet.create(IDENTIFIER, LBRACKET), MODIFIER_KEYWORDS); private static final TokenSet SOFT_KEYWORDS_AT_MEMBER_START = TokenSet.create(CONSTRUCTOR_KEYWORD, INIT_KEYWORD); - private static final TokenSet ANNOTATION_TARGETS = TokenSet.create(FILE_KEYWORD, FIELD_KEYWORD); + private static final TokenSet ANNOTATION_TARGETS = TokenSet.create( + FILE_KEYWORD, FIELD_KEYWORD, GET_KEYWORD, SET_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SPARAM_KEYWORD); static JetParsing createForTopLevel(SemanticWhitespaceAwarePsiBuilder builder) { JetParsing jetParsing = new JetParsing(builder); @@ -544,8 +545,18 @@ public class JetParsing extends AbstractJetParsing { * : annotationPrefix "[" unescapedAnnotation+ "]" * ; * + * annotationUseSiteTarget + * : "file" + * : "field" + * : "property" + * : "get" + * : "set" + * : "param" + * : "sparam" + * ; + * * annotationPrefix: - * : ("@" (":" ("file" | "field"))?) + * : ("@" (annotationUseSiteTarget ":")?) * ; */ private boolean parseAnnotationOrList(AnnotationParsingMode mode) { diff --git a/compiler/testData/psi/SoftKeywords.kt b/compiler/testData/psi/SoftKeywords.kt index 29d9fb357be..55e0c82591b 100644 --- a/compiler/testData/psi/SoftKeywords.kt +++ b/compiler/testData/psi/SoftKeywords.kt @@ -54,6 +54,11 @@ ref val private val protected val internal + val field + val property + val receiver + val param + val sparam get() = a set(S : s) {} @@ -82,6 +87,11 @@ ref fun private () : private fun protected () : protected fun internal () : internal + fun field () : field + fun property () : property + fun receiver () : receiver + fun param () : param + fun sparam () : sparam fun test( abstract : t, @@ -107,6 +117,11 @@ ref private : t, protected : t, internal : t, + field : t, + property : t, + receiver : t, + param : t, + sparam : t, public protected private internal abstract open enum @@ -149,6 +164,11 @@ class F(val foo : bar, private : t, protected : t, internal : t, + field : t, + property : t, + receiver : t, + param : t, + sparam : t, public protected private internal abstract open enum diff --git a/compiler/testData/psi/SoftKeywords.txt b/compiler/testData/psi/SoftKeywords.txt index 6f8cdcef66b..baa7d2c5a0e 100644 --- a/compiler/testData/psi/SoftKeywords.txt +++ b/compiler/testData/psi/SoftKeywords.txt @@ -295,6 +295,31 @@ JetFile: SoftKeywords.kt PsiElement(val)('val') PsiWhiteSpace(' ') PsiElement(IDENTIFIER)('internal') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('field') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('property') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('receiver') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('param') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('sparam') PsiWhiteSpace('\n ') PROPERTY_ACCESSOR PsiElement(get)('get') @@ -701,6 +726,86 @@ JetFile: SoftKeywords.kt USER_TYPE REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('internal') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('field') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('field') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('property') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('property') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('receiver') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('receiver') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('param') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('param') + PsiWhiteSpace('\n ') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('sparam') + PsiWhiteSpace(' ') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('sparam') PsiWhiteSpace('\n\n ') FUN PsiElement(fun)('fun') @@ -961,6 +1066,61 @@ JetFile: SoftKeywords.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('t') PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('field') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('property') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('receiver') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('param') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('sparam') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') PsiWhiteSpace('\n ') VALUE_PARAMETER MODIFIER_LIST @@ -1286,6 +1446,61 @@ JetFile: SoftKeywords.kt REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('t') PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('field') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('property') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('receiver') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('param') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('sparam') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('t') + PsiElement(COMMA)(',') PsiWhiteSpace('\n ') VALUE_PARAMETER MODIFIER_LIST diff --git a/grammar/src/attributes.grm b/grammar/src/attributes.grm index bdbc0205be0..24a558a7ae9 100644 --- a/grammar/src/attributes.grm +++ b/grammar/src/attributes.grm @@ -14,8 +14,18 @@ annotationList : annotationPrefix "[" unescapedAnnotation+ "]" ; +annotationUseSiteTarget + : "file" + : "field" + : "property" + : "get" + : "set" + : "param" + : "sparam" + ; + annotationPrefix: - : ("@" (":" ("file" | "field"))?) + : ("@" (annotationUseSiteTarget ":")?) ; unescapedAnnotation