Introduction of AnnotationTarget.CLASS as a replacement for CLASSIFIER (first step)

This commit is contained in:
Mikhail Glukhikh
2015-09-11 15:33:47 +03:00
parent 8b970cd186
commit 3770e7f49f
28 changed files with 53 additions and 50 deletions
@@ -189,6 +189,7 @@ public abstract class AnnotationCodegen {
static {
annotationTargetMap.put(KotlinTarget.CLASSIFIER, ElementType.TYPE);
annotationTargetMap.put(KotlinTarget.CLASS, ElementType.TYPE);
annotationTargetMap.put(KotlinTarget.ANNOTATION_CLASS, ElementType.ANNOTATION_TYPE);
annotationTargetMap.put(KotlinTarget.CONSTRUCTOR, ElementType.CONSTRUCTOR);
annotationTargetMap.put(KotlinTarget.LOCAL_VARIABLE, ElementType.LOCAL_VARIABLE);
@@ -204,7 +204,7 @@ public class AnnotationChecker(private val additionalCheckers: Iterable<Addition
}
private object TargetLists {
val T_CLASSIFIER = targetList(CLASSIFIER)
val T_CLASSIFIER = targetList(CLASS, CLASSIFIER)
val T_LOCAL_VARIABLE = targetList(LOCAL_VARIABLE) {
onlyWithUseSiteTarget(PROPERTY, FIELD, PROPERTY_GETTER, PROPERTY_SETTER, VALUE_PARAMETER)
@@ -39,26 +39,26 @@ public object ModifierCheckerCore {
private val possibleTargetMap = mapOf<JetModifierKeywordToken, Set<KotlinTarget>>(
ENUM_KEYWORD to EnumSet.of(ENUM_CLASS),
ABSTRACT_KEYWORD to EnumSet.of(CLASS, LOCAL_CLASS, INNER_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION),
OPEN_KEYWORD to EnumSet.of(CLASS, LOCAL_CLASS, INNER_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION),
FINAL_KEYWORD to EnumSet.of(CLASS, LOCAL_CLASS, INNER_CLASS, ENUM_CLASS, OBJECT, MEMBER_PROPERTY, MEMBER_FUNCTION),
SEALED_KEYWORD to EnumSet.of(CLASS, LOCAL_CLASS, INNER_CLASS),
ABSTRACT_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION),
OPEN_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS, INTERFACE, MEMBER_PROPERTY, MEMBER_FUNCTION),
FINAL_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS, ENUM_CLASS, OBJECT, MEMBER_PROPERTY, MEMBER_FUNCTION),
SEALED_KEYWORD to EnumSet.of(CLASS_ONLY, LOCAL_CLASS, INNER_CLASS),
INNER_KEYWORD to EnumSet.of(INNER_CLASS),
OVERRIDE_KEYWORD to EnumSet.of(MEMBER_PROPERTY, MEMBER_FUNCTION),
PRIVATE_KEYWORD to EnumSet.of(CLASSIFIER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
PRIVATE_KEYWORD to EnumSet.of(CLASS, CLASSIFIER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
MEMBER_PROPERTY, TOP_LEVEL_PROPERTY, CONSTRUCTOR),
PUBLIC_KEYWORD to EnumSet.of(CLASSIFIER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
PUBLIC_KEYWORD to EnumSet.of(CLASS, CLASSIFIER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
MEMBER_PROPERTY, TOP_LEVEL_PROPERTY, CONSTRUCTOR),
INTERNAL_KEYWORD to EnumSet.of(CLASSIFIER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
INTERNAL_KEYWORD to EnumSet.of(CLASS, CLASSIFIER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
MEMBER_PROPERTY, TOP_LEVEL_PROPERTY, CONSTRUCTOR),
PROTECTED_KEYWORD to EnumSet.of(CLASSIFIER, MEMBER_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, MEMBER_PROPERTY, CONSTRUCTOR),
PROTECTED_KEYWORD to EnumSet.of(CLASS, CLASSIFIER, MEMBER_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, MEMBER_PROPERTY, CONSTRUCTOR),
IN_KEYWORD to EnumSet.of(TYPE_PARAMETER, TYPE_PROJECTION),
OUT_KEYWORD to EnumSet.of(TYPE_PARAMETER, TYPE_PROJECTION),
REIFIED_KEYWORD to EnumSet.of(TYPE_PARAMETER),
VARARG_KEYWORD to EnumSet.of(VALUE_PARAMETER, PROPERTY_PARAMETER),
COMPANION_KEYWORD to EnumSet.of(OBJECT),
LATE_INIT_KEYWORD to EnumSet.of(MEMBER_PROPERTY),
DATA_KEYWORD to EnumSet.of(CLASSIFIER),
DATA_KEYWORD to EnumSet.of(CLASS, CLASSIFIER),
INLINE_KEYWORD to EnumSet.of(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, PROPERTY),
NOINLINE_KEYWORD to EnumSet.of(VALUE_PARAMETER),
TAILREC_KEYWORD to EnumSet.of(FUNCTION),
@@ -75,10 +75,10 @@ public object ModifierCheckerCore {
)
private val possibleParentTargetMap = mapOf<JetModifierKeywordToken, Set<KotlinTarget>>(
INNER_KEYWORD to EnumSet.of(CLASS, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS, ENUM_ENTRY),
OVERRIDE_KEYWORD to EnumSet.of(CLASSIFIER, ENUM_ENTRY),
PROTECTED_KEYWORD to EnumSet.of(CLASSIFIER, ENUM_ENTRY),
COMPANION_KEYWORD to EnumSet.of(CLASS, ENUM_CLASS, INTERFACE)
INNER_KEYWORD to EnumSet.of(CLASS_ONLY, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS, ENUM_ENTRY),
OVERRIDE_KEYWORD to EnumSet.of(CLASS, CLASSIFIER, ENUM_ENTRY),
PROTECTED_KEYWORD to EnumSet.of(CLASS, CLASSIFIER, ENUM_ENTRY),
COMPANION_KEYWORD to EnumSet.of(CLASS_ONLY, ENUM_CLASS, INTERFACE)
)
// First modifier in pair should be also first in declaration
+1 -1
View File
@@ -1,6 +1,6 @@
package foo
@Target(AnnotationTarget.CLASSIFIER, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
annotation class fancy
@fancy
@@ -1,4 +1,4 @@
package test
@Target(AnnotationTarget.CLASSIFIER)
@Target(AnnotationTarget.CLASS)
annotation class classifier
@@ -1,5 +1,5 @@
package test
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER}) kotlin.annotation.annotation() public final class classifier : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) kotlin.annotation.annotation() public final class classifier : kotlin.Annotation {
public constructor classifier()
}
@@ -1,4 +1,4 @@
package test
@Target(AnnotationTarget.CLASSIFIER, AnnotationTarget.FUNCTION)
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
annotation class multiple
@@ -1,5 +1,5 @@
package test
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER, AnnotationTarget.FUNCTION}) kotlin.annotation.annotation() public final class multiple : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION}) kotlin.annotation.annotation() public final class multiple : kotlin.Annotation {
public constructor multiple()
}
@@ -1,5 +1,5 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
@Target(AnnotationTarget.TYPE, AnnotationTarget.CLASSIFIER,
@Target(AnnotationTarget.TYPE, AnnotationTarget.CLASS,
AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION,
AnnotationTarget.EXPRESSION, AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.SOURCE)
@@ -10,7 +10,7 @@ Ann(x = 1) Ann(x = 2) Ann(x = 3) private final class A {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE, AnnotationTarget.CLASSIFIER, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.EXPRESSION, AnnotationTarget.PROPERTY}) kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) kotlin.annotation.Repeatable() kotlin.annotation.annotation() public final class Ann : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.EXPRESSION, AnnotationTarget.PROPERTY}) kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) kotlin.annotation.Repeatable() kotlin.annotation.annotation() public final class Ann : kotlin.Annotation {
public constructor Ann(/*0*/ x: kotlin.Int = ...)
public final val x: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -1,7 +1,7 @@
import java.lang.annotation.*
<!DEPRECATED_JAVA_ANNOTATION!>@java.lang.annotation.Target(ElementType.PACKAGE)<!>
@Target(AnnotationTarget.CLASSIFIER)
@Target(AnnotationTarget.CLASS)
annotation class my
<!DEPRECATED_JAVA_ANNOTATION!>@java.lang.annotation.Retention(RetentionPolicy.SOURCE)<!>
@@ -1,6 +1,6 @@
package
java.lang.annotation.Target(value = {ElementType.PACKAGE}) kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER}) kotlin.annotation.annotation() public final class my : kotlin.Annotation {
java.lang.annotation.Target(value = {ElementType.PACKAGE}) kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) kotlin.annotation.annotation() public final class my : kotlin.Annotation {
public constructor my()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -1,4 +1,4 @@
@Target(AnnotationTarget.CLASSIFIER)
@Target(AnnotationTarget.CLASS)
annotation class base
@base data class My
@@ -8,7 +8,7 @@ base() kotlin.data() public final class My {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER}) kotlin.annotation.annotation() public final class base : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) kotlin.annotation.annotation() public final class base : kotlin.Annotation {
public constructor base()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -1,5 +1,5 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
@Target(AnnotationTarget.CLASSIFIER) annotation class base
@Target(AnnotationTarget.CLASS) annotation class base
@base annotation class derived
@@ -22,7 +22,7 @@ base() public final enum class My : kotlin.Enum<My> {
public final /*synthesized*/ fun values(): kotlin.Array<My>
}
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER}) kotlin.annotation.annotation() public final class base : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) kotlin.annotation.annotation() public final class base : kotlin.Annotation {
public constructor base()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -64,7 +64,7 @@ package test {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER, AnnotationTarget.FILE}) public final class type : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FILE}) public final class type : kotlin.Annotation {
public constructor type()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -1,4 +1,4 @@
@Target(AnnotationTarget.CLASSIFIER)
@Target(AnnotationTarget.CLASS)
annotation class base
@Target(AnnotationTarget.ANNOTATION_CLASS)
@@ -22,7 +22,7 @@ base() public final class Outer {
}
}
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER}) kotlin.annotation.annotation() public final class base : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) kotlin.annotation.annotation() public final class base : kotlin.Annotation {
public constructor base()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -39,7 +39,7 @@ public open class AnnotationTargets {
public constructor parameter()
}
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER, AnnotationTarget.FILE}) public final class type : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FILE}) public final class type : kotlin.Annotation {
public constructor type()
}
}
@@ -2,5 +2,5 @@
package test
@Target(AnnotationTarget.CLASSIFIER)
@Target(AnnotationTarget.CLASS)
public annotation class TargetedAnnotation
@@ -1,5 +1,5 @@
package test
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER}) kotlin.annotation.annotation() public final class TargetedAnnotation : kotlin.Annotation {
kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) kotlin.annotation.annotation() public final class TargetedAnnotation : kotlin.Annotation {
/*primary*/ public constructor TargetedAnnotation()
}
@@ -22,6 +22,7 @@ package kotlin.annotation
public enum class AnnotationTarget {
/** Class, interface or object, annotation class is also included */
CLASSIFIER,
CLASS,
/** Annotation class only */
ANNOTATION_CLASS,
/** Generic type parameter (unsupported yet) */
@@ -156,7 +156,7 @@ class JavaRetentionAnnotationDescriptor(
public object JavaAnnotationTargetMapper {
private val targetNameLists = mapOf("PACKAGE" to EnumSet.noneOf(KotlinTarget::class.java),
"TYPE" to EnumSet.of(KotlinTarget.CLASSIFIER, KotlinTarget.FILE),
"TYPE" to EnumSet.of(KotlinTarget.CLASS, KotlinTarget.FILE),
"ANNOTATION_TYPE" to EnumSet.of(KotlinTarget.ANNOTATION_CLASS),
"TYPE_PARAMETER" to EnumSet.of(KotlinTarget.TYPE_PARAMETER),
"FIELD" to EnumSet.of(KotlinTarget.FIELD),
@@ -24,7 +24,8 @@ import java.util.*
// NOTE: this enum must have the same entries with kotlin.annotation.AnnotationTarget,
// and may also have some additional entries
public enum class KotlinTarget(val description: String, val isDefault: Boolean = true) {
CLASSIFIER("classifier"), // includes CLASS, OBJECT, INTERFACE, *_CLASS but not ENUM_ENTRY
CLASSIFIER("class"), // deprecated: migrates to CLASS
CLASS("class"), // includes CLASS_ONLY, OBJECT, INTERFACE, *_CLASS but not ENUM_ENTRY
ANNOTATION_CLASS("annotation class"),
TYPE_PARAMETER("type parameter", false),
PROPERTY("property"), // includes *_PROPERTY, PROPERTY_PARAMETER, ENUM_ENTRY
@@ -43,7 +44,7 @@ public enum class KotlinTarget(val description: String, val isDefault: Boolean =
STAR_PROJECTION("star projection", false),
PROPERTY_PARAMETER("property constructor parameter", false),
CLASS("class", false),
CLASS_ONLY("class", false), // includes only top level classes and nested classes (but not enums, objects, interfaces, inner or local classes)
OBJECT("object", false),
INTERFACE("interface", false),
ENUM_CLASS("enum class", false),
@@ -79,25 +80,25 @@ public enum class KotlinTarget(val description: String, val isDefault: Boolean =
public val ALL_TARGET_SET: Set<KotlinTarget> = values().toSet()
public fun classActualTargets(descriptor: ClassDescriptor): List<KotlinTarget> = when (descriptor.kind) {
ClassKind.ANNOTATION_CLASS -> listOf(ANNOTATION_CLASS, CLASSIFIER)
ClassKind.ANNOTATION_CLASS -> listOf(ANNOTATION_CLASS, CLASS, CLASSIFIER)
ClassKind.CLASS ->
if (descriptor.isInner) {
listOf(INNER_CLASS, CLASSIFIER)
listOf(INNER_CLASS, CLASS, CLASSIFIER)
}
else if (DescriptorUtils.isLocal(descriptor)) {
listOf(LOCAL_CLASS, CLASSIFIER)
listOf(LOCAL_CLASS, CLASS, CLASSIFIER)
}
else {
listOf(CLASS, CLASSIFIER)
listOf(CLASS_ONLY, CLASS, CLASSIFIER)
}
ClassKind.OBJECT -> listOf(OBJECT, CLASSIFIER)
ClassKind.INTERFACE -> listOf(INTERFACE, CLASSIFIER)
ClassKind.OBJECT -> listOf(OBJECT, CLASS, CLASSIFIER)
ClassKind.INTERFACE -> listOf(INTERFACE, CLASS, CLASSIFIER)
ClassKind.ENUM_CLASS ->
if (DescriptorUtils.isLocal(descriptor)) {
listOf(LOCAL_CLASS, CLASSIFIER)
listOf(LOCAL_CLASS, CLASS, CLASSIFIER)
}
else {
listOf(ENUM_CLASS, CLASSIFIER)
listOf(ENUM_CLASS, CLASS, CLASSIFIER)
}
ClassKind.ENUM_ENTRY -> listOf(ENUM_ENTRY, PROPERTY, FIELD)
}
@@ -1,13 +1,13 @@
package dependency
@Target(AnnotationTarget.CLASSIFIER, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.TYPE)
annotation class A(val s: String)
@Target(AnnotationTarget.CLASSIFIER, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.TYPE)
annotation class B(val i: Int)
@Target(AnnotationTarget.CLASSIFIER, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY,
AnnotationTarget.VALUE_PARAMETER)
annotation class C
@@ -27,10 +27,10 @@ a public class Annotations private @a constructor(private @property:a @param:a v
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FUNCTION,
AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER,
AnnotationTarget.TYPE, AnnotationTarget.CLASSIFIER)
AnnotationTarget.TYPE, AnnotationTarget.CLASS)
annotation class a
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION, AnnotationTarget.CLASSIFIER,
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION, AnnotationTarget.CLASS,
AnnotationTarget.CONSTRUCTOR, AnnotationTarget.TYPE)
@Retention(AnnotationRetention.SOURCE)
@Repeatable
+1 -1
View File
@@ -1,4 +1,4 @@
<info descr="null" textAttributesKey="KOTLIN_ANNOTATION">@Target</info>(<info descr="null" textAttributesKey="KOTLIN_CLASS">AnnotationTarget</info>.<info descr="null" textAttributesKey="KOTLIN_ENUM_ENTRY">CLASSIFIER</info>, <info descr="null" textAttributesKey="KOTLIN_CLASS">AnnotationTarget</info>.<info descr="null" textAttributesKey="KOTLIN_ENUM_ENTRY">EXPRESSION</info>)
<info descr="null" textAttributesKey="KOTLIN_ANNOTATION">@Target</info>(<info descr="null" textAttributesKey="KOTLIN_CLASS">AnnotationTarget</info>.<info descr="null" textAttributesKey="KOTLIN_ENUM_ENTRY">CLASS</info>, <info descr="null" textAttributesKey="KOTLIN_CLASS">AnnotationTarget</info>.<info descr="null" textAttributesKey="KOTLIN_ENUM_ENTRY">EXPRESSION</info>)
<info descr="null">annotation</info> class <info descr="null">Ann</info>
<info descr="null" textAttributesKey="KOTLIN_ANNOTATION">@Ann</info> class <info descr="null">A</info>