Move AnnotationTargetLists & KotlinTarget to common compiler code
This commit is contained in:
+30
-27
@@ -1,13 +1,11 @@
|
||||
/*
|
||||
* Copyright 2000-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.descriptors.annotations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import java.util.*
|
||||
|
||||
// NOTE: this enum must have the same entries with kotlin.annotation.AnnotationTarget,
|
||||
@@ -33,8 +31,11 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true)
|
||||
STAR_PROJECTION("star projection", false),
|
||||
PROPERTY_PARAMETER("property constructor parameter", false),
|
||||
|
||||
CLASS_ONLY("class", false), // includes only top level classes and nested/inner classes (but not enums, objects, interfaces and local classes)
|
||||
OBJECT("object", false), // does not include OBJECT_LITERAL but DOES include COMPANION_OBJECT
|
||||
// includes only top level classes and nested/inner classes (but not enums, objects, interfaces and local classes)
|
||||
CLASS_ONLY("class", false),
|
||||
|
||||
// does not include OBJECT_LITERAL but DOES include COMPANION_OBJECT
|
||||
OBJECT("object", false),
|
||||
COMPANION_OBJECT("companion object", false),
|
||||
INTERFACE("interface", false),
|
||||
ENUM_CLASS("enum class", false),
|
||||
@@ -59,7 +60,7 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true)
|
||||
DESTRUCTURING_DECLARATION("destructuring declaration", false),
|
||||
LAMBDA_EXPRESSION("lambda expression", false),
|
||||
ANONYMOUS_FUNCTION("anonymous function", false),
|
||||
OBJECT_LITERAL("object literal", false)
|
||||
OBJECT_LITERAL("object literal", false),
|
||||
;
|
||||
|
||||
companion object {
|
||||
@@ -67,7 +68,7 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true)
|
||||
private val map = HashMap<String, KotlinTarget>()
|
||||
|
||||
init {
|
||||
for (target in KotlinTarget.values()) {
|
||||
for (target in values()) {
|
||||
map[target.name] = target
|
||||
}
|
||||
}
|
||||
@@ -78,44 +79,46 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true)
|
||||
|
||||
val ALL_TARGET_SET: Set<KotlinTarget> = values().toSet()
|
||||
|
||||
fun classActualTargets(descriptor: ClassDescriptor): List<KotlinTarget> = when (descriptor.kind) {
|
||||
fun classActualTargets(
|
||||
kind: ClassKind,
|
||||
isInnerClass: Boolean,
|
||||
isCompanionObject: Boolean,
|
||||
isLocalClass: Boolean
|
||||
): List<KotlinTarget> = when (kind) {
|
||||
ClassKind.ANNOTATION_CLASS -> listOf(ANNOTATION_CLASS, CLASS)
|
||||
ClassKind.CLASS ->
|
||||
// inner local classes should be CLASS_ONLY, not LOCAL_CLASS
|
||||
if (!descriptor.isInner && DescriptorUtils.isLocal(descriptor)) {
|
||||
if (!isInnerClass && isLocalClass) {
|
||||
listOf(LOCAL_CLASS, CLASS)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
listOf(CLASS_ONLY, CLASS)
|
||||
}
|
||||
ClassKind.OBJECT ->
|
||||
if (descriptor.isCompanionObject) {
|
||||
if (isCompanionObject) {
|
||||
listOf(COMPANION_OBJECT, OBJECT, CLASS)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
listOf(OBJECT, CLASS)
|
||||
}
|
||||
ClassKind.INTERFACE -> listOf(INTERFACE, CLASS)
|
||||
ClassKind.ENUM_CLASS ->
|
||||
if (DescriptorUtils.isLocal(descriptor)) {
|
||||
if (isLocalClass) {
|
||||
listOf(LOCAL_CLASS, CLASS)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
listOf(ENUM_CLASS, CLASS)
|
||||
}
|
||||
ClassKind.ENUM_ENTRY -> listOf(ENUM_ENTRY, PROPERTY, FIELD)
|
||||
}
|
||||
|
||||
val USE_SITE_MAPPING: Map<AnnotationUseSiteTarget, KotlinTarget> = mapOf(
|
||||
AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER to VALUE_PARAMETER,
|
||||
AnnotationUseSiteTarget.FIELD to FIELD,
|
||||
AnnotationUseSiteTarget.PROPERTY to PROPERTY,
|
||||
AnnotationUseSiteTarget.FILE to FILE,
|
||||
AnnotationUseSiteTarget.PROPERTY_GETTER to PROPERTY_GETTER,
|
||||
AnnotationUseSiteTarget.PROPERTY_SETTER to PROPERTY_SETTER,
|
||||
AnnotationUseSiteTarget.RECEIVER to VALUE_PARAMETER,
|
||||
AnnotationUseSiteTarget.SETTER_PARAMETER to VALUE_PARAMETER,
|
||||
AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD to FIELD)
|
||||
|
||||
AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER to VALUE_PARAMETER,
|
||||
AnnotationUseSiteTarget.FIELD to FIELD,
|
||||
AnnotationUseSiteTarget.PROPERTY to PROPERTY,
|
||||
AnnotationUseSiteTarget.FILE to FILE,
|
||||
AnnotationUseSiteTarget.PROPERTY_GETTER to PROPERTY_GETTER,
|
||||
AnnotationUseSiteTarget.PROPERTY_SETTER to PROPERTY_SETTER,
|
||||
AnnotationUseSiteTarget.RECEIVER to VALUE_PARAMETER,
|
||||
AnnotationUseSiteTarget.SETTER_PARAMETER to VALUE_PARAMETER,
|
||||
AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD to FIELD
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@file:Suppress("FunctionName")
|
||||
|
||||
package org.jetbrains.kotlin.resolve
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.*
|
||||
|
||||
object AnnotationTargetLists {
|
||||
val T_CLASSIFIER = targetList(CLASS)
|
||||
val T_TYPEALIAS = targetList(TYPEALIAS)
|
||||
|
||||
val T_LOCAL_VARIABLE = targetList(LOCAL_VARIABLE) {
|
||||
onlyWithUseSiteTarget(PROPERTY_SETTER, VALUE_PARAMETER)
|
||||
}
|
||||
|
||||
val T_DESTRUCTURING_DECLARATION = targetList(DESTRUCTURING_DECLARATION)
|
||||
|
||||
private fun TargetListBuilder.propertyTargets(backingField: Boolean, delegate: Boolean) {
|
||||
if (backingField) extraTargets(FIELD)
|
||||
if (delegate) {
|
||||
onlyWithUseSiteTarget(VALUE_PARAMETER, PROPERTY_GETTER, PROPERTY_SETTER, FIELD)
|
||||
} else {
|
||||
onlyWithUseSiteTarget(VALUE_PARAMETER, PROPERTY_GETTER, PROPERTY_SETTER)
|
||||
}
|
||||
}
|
||||
|
||||
fun T_MEMBER_PROPERTY(backingField: Boolean, delegate: Boolean) =
|
||||
targetList(
|
||||
when {
|
||||
backingField -> MEMBER_PROPERTY_WITH_BACKING_FIELD
|
||||
delegate -> MEMBER_PROPERTY_WITH_DELEGATE
|
||||
else -> MEMBER_PROPERTY_WITHOUT_FIELD_OR_DELEGATE
|
||||
}, MEMBER_PROPERTY, PROPERTY
|
||||
) {
|
||||
propertyTargets(backingField, delegate)
|
||||
}
|
||||
|
||||
fun T_TOP_LEVEL_PROPERTY(backingField: Boolean, delegate: Boolean) =
|
||||
targetList(
|
||||
when {
|
||||
backingField -> TOP_LEVEL_PROPERTY_WITH_BACKING_FIELD
|
||||
delegate -> TOP_LEVEL_PROPERTY_WITH_DELEGATE
|
||||
else -> TOP_LEVEL_PROPERTY_WITHOUT_FIELD_OR_DELEGATE
|
||||
}, TOP_LEVEL_PROPERTY, PROPERTY
|
||||
) {
|
||||
propertyTargets(backingField, delegate)
|
||||
}
|
||||
|
||||
val T_PROPERTY_GETTER = targetList(PROPERTY_GETTER)
|
||||
val T_PROPERTY_SETTER = targetList(PROPERTY_SETTER)
|
||||
|
||||
val T_VALUE_PARAMETER_WITHOUT_VAL = targetList(VALUE_PARAMETER)
|
||||
|
||||
val T_VALUE_PARAMETER_WITH_VAL = targetList(VALUE_PARAMETER, PROPERTY, MEMBER_PROPERTY) {
|
||||
extraTargets(FIELD)
|
||||
onlyWithUseSiteTarget(PROPERTY_GETTER, PROPERTY_SETTER)
|
||||
}
|
||||
|
||||
val T_FILE = targetList(FILE)
|
||||
|
||||
val T_CONSTRUCTOR = targetList(CONSTRUCTOR)
|
||||
|
||||
val T_LOCAL_FUNCTION = targetList(LOCAL_FUNCTION, FUNCTION) {
|
||||
onlyWithUseSiteTarget(VALUE_PARAMETER)
|
||||
}
|
||||
|
||||
val T_MEMBER_FUNCTION = targetList(MEMBER_FUNCTION, FUNCTION) {
|
||||
onlyWithUseSiteTarget(VALUE_PARAMETER)
|
||||
}
|
||||
|
||||
val T_TOP_LEVEL_FUNCTION = targetList(TOP_LEVEL_FUNCTION, FUNCTION) {
|
||||
onlyWithUseSiteTarget(VALUE_PARAMETER)
|
||||
}
|
||||
|
||||
val T_EXPRESSION = targetList(EXPRESSION)
|
||||
|
||||
val T_FUNCTION_LITERAL = targetList(LAMBDA_EXPRESSION, FUNCTION, EXPRESSION)
|
||||
|
||||
val T_FUNCTION_EXPRESSION = targetList(ANONYMOUS_FUNCTION, FUNCTION, EXPRESSION)
|
||||
|
||||
val T_OBJECT_LITERAL = targetList(OBJECT_LITERAL, CLASS, EXPRESSION)
|
||||
|
||||
val T_TYPE_REFERENCE = targetList(TYPE) {
|
||||
onlyWithUseSiteTarget(VALUE_PARAMETER)
|
||||
}
|
||||
|
||||
val T_TYPE_PARAMETER = targetList(TYPE_PARAMETER)
|
||||
|
||||
val T_STAR_PROJECTION = targetList(STAR_PROJECTION)
|
||||
val T_TYPE_PROJECTION = targetList(TYPE_PROJECTION)
|
||||
|
||||
val T_INITIALIZER = targetList(INITIALIZER)
|
||||
|
||||
|
||||
private fun targetList(vararg target: KotlinTarget, otherTargets: TargetListBuilder.() -> Unit = {}): AnnotationTargetList {
|
||||
val builder = TargetListBuilder(*target)
|
||||
builder.otherTargets()
|
||||
return builder.build()
|
||||
}
|
||||
|
||||
val EMPTY = targetList()
|
||||
|
||||
private class TargetListBuilder(vararg val defaultTargets: KotlinTarget) {
|
||||
private var canBeSubstituted: List<KotlinTarget> = listOf()
|
||||
private var onlyWithUseSiteTarget: List<KotlinTarget> = listOf()
|
||||
|
||||
fun extraTargets(vararg targets: KotlinTarget) {
|
||||
canBeSubstituted = targets.toList()
|
||||
}
|
||||
|
||||
fun onlyWithUseSiteTarget(vararg targets: KotlinTarget) {
|
||||
onlyWithUseSiteTarget = targets.toList()
|
||||
}
|
||||
|
||||
fun build() = AnnotationTargetList(defaultTargets.toList(), canBeSubstituted, onlyWithUseSiteTarget)
|
||||
}
|
||||
}
|
||||
|
||||
class AnnotationTargetList(
|
||||
val defaultTargets: List<KotlinTarget>,
|
||||
val canBeSubstituted: List<KotlinTarget> = emptyList(),
|
||||
val onlyWithUseSiteTarget: List<KotlinTarget> = emptyList()
|
||||
)
|
||||
|
||||
object UseSiteTargetsList {
|
||||
val T_CONSTRUCTOR_PARAMETER = listOf(
|
||||
AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER,
|
||||
AnnotationUseSiteTarget.PROPERTY,
|
||||
AnnotationUseSiteTarget.FIELD
|
||||
)
|
||||
|
||||
val T_PROPERTY = listOf(
|
||||
AnnotationUseSiteTarget.PROPERTY,
|
||||
AnnotationUseSiteTarget.FIELD
|
||||
)
|
||||
}
|
||||
-1
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.SourceElement
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.*
|
||||
import org.jetbrains.kotlin.load.java.descriptors.PossiblyExternalAnnotationDescriptor
|
||||
import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext
|
||||
|
||||
Reference in New Issue
Block a user