diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtToJvmAnnotationsConverter.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtToJvmAnnotationsConverter.kt index 30a78d43dac..f8961b2280d 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtToJvmAnnotationsConverter.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtToJvmAnnotationsConverter.kt @@ -14,10 +14,12 @@ import com.intellij.psi.PsiNameValuePair import org.jetbrains.kotlin.asJava.classes.KtUltraLightSimpleAnnotation import org.jetbrains.kotlin.asJava.classes.KtUltraLightSupport import org.jetbrains.kotlin.builtins.StandardNames.FqNames +import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.constants.ArrayValue import org.jetbrains.kotlin.resolve.constants.EnumValue +import java.util.* private const val JAVA_LANG_ANNOTATION_DOCUMENTED = "java.lang.annotation.Documented" @@ -49,18 +51,27 @@ private fun PsiAnnotation.extractArrayAnnotationFqNames(attributeName: String): .map { "${it.first.asSingleFqName().asString()}.${it.second.identifier}" } } -private val javaAnnotationElementTypeId = ClassId.fromString("java.lang.annotation.ElementType") -private val targetMapping = hashMapOf( - "kotlin.annotation.AnnotationTarget.CLASS" to EnumValue(javaAnnotationElementTypeId, Name.identifier("TYPE")), - "kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS" to EnumValue(javaAnnotationElementTypeId, Name.identifier("ANNOTATION_TYPE")), - "kotlin.annotation.AnnotationTarget.FIELD" to EnumValue(javaAnnotationElementTypeId, Name.identifier("FIELD")), - "kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE" to EnumValue(javaAnnotationElementTypeId, Name.identifier("LOCAL_VARIABLE")), - "kotlin.annotation.AnnotationTarget.VALUE_PARAMETER" to EnumValue(javaAnnotationElementTypeId, Name.identifier("PARAMETER")), - "kotlin.annotation.AnnotationTarget.CONSTRUCTOR" to EnumValue(javaAnnotationElementTypeId, Name.identifier("CONSTRUCTOR")), - "kotlin.annotation.AnnotationTarget.FUNCTION" to EnumValue(javaAnnotationElementTypeId, Name.identifier("METHOD")), - "kotlin.annotation.AnnotationTarget.PROPERTY_GETTER" to EnumValue(javaAnnotationElementTypeId, Name.identifier("METHOD")), - "kotlin.annotation.AnnotationTarget.PROPERTY_SETTER" to EnumValue(javaAnnotationElementTypeId, Name.identifier("METHOD")) -) +private val targetMappings = EnumMap>(JvmTarget::class.java).also { result -> + val javaAnnotationElementTypeId = ClassId.fromString("java.lang.annotation.ElementType") + val jdk6 = hashMapOf( + "kotlin.annotation.AnnotationTarget.CLASS" to EnumValue(javaAnnotationElementTypeId, Name.identifier("TYPE")), + "kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS" to EnumValue(javaAnnotationElementTypeId, Name.identifier("ANNOTATION_TYPE")), + "kotlin.annotation.AnnotationTarget.FIELD" to EnumValue(javaAnnotationElementTypeId, Name.identifier("FIELD")), + "kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE" to EnumValue(javaAnnotationElementTypeId, Name.identifier("LOCAL_VARIABLE")), + "kotlin.annotation.AnnotationTarget.VALUE_PARAMETER" to EnumValue(javaAnnotationElementTypeId, Name.identifier("PARAMETER")), + "kotlin.annotation.AnnotationTarget.CONSTRUCTOR" to EnumValue(javaAnnotationElementTypeId, Name.identifier("CONSTRUCTOR")), + "kotlin.annotation.AnnotationTarget.FUNCTION" to EnumValue(javaAnnotationElementTypeId, Name.identifier("METHOD")), + "kotlin.annotation.AnnotationTarget.PROPERTY_GETTER" to EnumValue(javaAnnotationElementTypeId, Name.identifier("METHOD")), + "kotlin.annotation.AnnotationTarget.PROPERTY_SETTER" to EnumValue(javaAnnotationElementTypeId, Name.identifier("METHOD")) + ) + val jdk8AndLater = HashMap(jdk6).apply { + put("kotlin.annotation.AnnotationTarget.TYPE_PARAMETER", EnumValue(javaAnnotationElementTypeId, Name.identifier("TYPE_PARAMETER"))) + put("kotlin.annotation.AnnotationTarget.TYPE", EnumValue(javaAnnotationElementTypeId, Name.identifier("TYPE_USE"))) + } + for (target in JvmTarget.values()) { + result[target] = if (target >= JvmTarget.JVM_1_8) jdk8AndLater else jdk6 + } +} internal fun PsiAnnotation.tryConvertAsTarget(support: KtUltraLightSupport): KtLightAbstractAnnotation? { @@ -71,6 +82,7 @@ internal fun PsiAnnotation.tryConvertAsTarget(support: KtUltraLightSupport): KtL attributeValues ?: return null + val targetMapping = targetMappings.getValue(support.typeMapper.jvmTarget) val convertedValues = attributeValues.mapNotNull { targetMapping[it] }.distinct() val targetAttributes = "value" to ArrayValue(convertedValues) { module -> module.builtIns.array.defaultType } diff --git a/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.java b/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.java index e82640d994c..b9372c88d94 100644 --- a/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.java +++ b/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.java @@ -1,11 +1,11 @@ @java.lang.annotation.Documented() @java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.SOURCE) -@java.lang.annotation.Target(value = {}) +@java.lang.annotation.Target(value = {java.lang.annotation.ElementType.TYPE_PARAMETER, java.lang.annotation.ElementType.TYPE_USE}) @kotlin.annotation.MustBeDocumented() @kotlin.annotation.Repeatable() @kotlin.annotation.Retention(value = kotlin.annotation.AnnotationRetention.SOURCE) -@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) +@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.TYPE_PARAMETER, kotlin.annotation.AnnotationTarget.TYPE}) public abstract @interface Anno /* Anno*/ { public abstract int i();// i() -} \ No newline at end of file +} diff --git a/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.kt b/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.kt index 25433768b75..16242f5b9b4 100644 --- a/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.kt +++ b/compiler/testData/asJava/lightClasses/SpecialAnnotationsOnAnnotationClass.kt @@ -1,7 +1,7 @@ // Anno @Retention(AnnotationRetention.SOURCE) -@Target(AnnotationTarget.TYPE_PARAMETER) +@Target(AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.TYPE) @MustBeDocumented @Repeatable annotation class Anno(val i: Int)