diff --git a/compiler/testData/diagnostics/tests/annotations/AmbigiousAnnotationConstructor.kt b/compiler/testData/diagnostics/tests/annotations/AmbigiousAnnotationConstructor.kt index 52e3624136f..d1fa017e603 100644 --- a/compiler/testData/diagnostics/tests/annotations/AmbigiousAnnotationConstructor.kt +++ b/compiler/testData/diagnostics/tests/annotations/AmbigiousAnnotationConstructor.kt @@ -2,4 +2,4 @@ import java.util.ArrayList ArrayList(1, 1) fun b() {} Xoo(x) fun c() {} -Deprecated(x) fun a() {} \ No newline at end of file +Deprecated(x) fun a() {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/AnnotatedConstructorParams.kt b/compiler/testData/diagnostics/tests/annotations/AnnotatedConstructorParams.kt index b94d8d3116c..975cb343cdb 100644 --- a/compiler/testData/diagnostics/tests/annotations/AnnotatedConstructorParams.kt +++ b/compiler/testData/diagnostics/tests/annotations/AnnotatedConstructorParams.kt @@ -1,15 +1,15 @@ package a -import java.lang.Deprecated as deprecated +import java.lang.Deprecated as deprecated import java.lang.SuppressWarnings as suppresswarnings -deprecated suppresswarnings val s: String = ""; +deprecated suppresswarnings val s: String = ""; -deprecated suppresswarnings fun main(args : Array) { +deprecated suppresswarnings fun main(args : Array) { System.out.println("Hello, world!") } -class Test(deprecated val s: String, +class Test(deprecated val s: String, suppresswarnings val x : Int) {} diff --git a/compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt b/compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt index 7bc136a5558..95eef0689d6 100644 --- a/compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt +++ b/compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt @@ -1,2 +1,2 @@ -annotation @java.lang.Deprecated class my -annotation Deprecated class my1 \ No newline at end of file +annotation @java.lang.Deprecated class my +annotation Deprecated class my1 \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/Deprecated.kt b/compiler/testData/diagnostics/tests/annotations/Deprecated.kt index 670566ba34c..f3925d2a81e 100644 --- a/compiler/testData/diagnostics/tests/annotations/Deprecated.kt +++ b/compiler/testData/diagnostics/tests/annotations/Deprecated.kt @@ -1,5 +1,5 @@ -import java.lang.Deprecated as deprecated +import java.lang.Deprecated as deprecated -Deprecated fun foo() {} +Deprecated fun foo() {} -deprecated fun foo1() {} +deprecated fun foo1() {} \ No newline at end of file diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/JavaAnnotationMapper.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/JavaAnnotationMapper.kt index de69eb392bc..682beff69b9 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/JavaAnnotationMapper.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/JavaAnnotationMapper.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention +import org.jetbrains.kotlin.resolve.constants.ConstantValueFactory import org.jetbrains.kotlin.storage.StorageManager import java.lang.annotation.Retention import java.lang.annotation.Target @@ -47,21 +48,25 @@ public object JavaAnnotationMapper { private val javaTargetFqName = FqName(javaClass().canonicalName) private val javaRetentionFqName = FqName(javaClass().canonicalName) + private val javaDeprecatedFqName = FqName(javaClass().canonicalName) public fun mapJavaAnnotation(annotation: JavaAnnotation, c: LazyJavaResolverContext): AnnotationDescriptor? = when (annotation.classId) { ClassId.topLevel(javaTargetFqName) -> JavaTargetAnnotationDescriptor(annotation, c) ClassId.topLevel(javaRetentionFqName) -> JavaRetentionAnnotationDescriptor(annotation, c) + ClassId.topLevel(javaDeprecatedFqName) -> JavaDeprecatedAnnotationDescriptor(annotation, c) else -> null } public val kotlinToJavaNameMap: Map = mapOf(KotlinBuiltIns.FQ_NAMES.target to javaTargetFqName, - KotlinBuiltIns.FQ_NAMES.annotation to javaRetentionFqName) + KotlinBuiltIns.FQ_NAMES.annotation to javaRetentionFqName, + KotlinBuiltIns.FQ_NAMES.deprecated to javaDeprecatedFqName) public val javaToKotlinNameMap: Map = mapOf(javaTargetFqName to KotlinBuiltIns.FQ_NAMES.target, - javaRetentionFqName to KotlinBuiltIns.FQ_NAMES.annotation) + javaRetentionFqName to KotlinBuiltIns.FQ_NAMES.annotation, + javaDeprecatedFqName to KotlinBuiltIns.FQ_NAMES.deprecated) } abstract class AbstractJavaAnnotationDescriptor( @@ -76,6 +81,21 @@ abstract class AbstractJavaAnnotationDescriptor( protected val firstArgument: JavaAnnotationArgument? = annotation.arguments.firstOrNull() } +class JavaDeprecatedAnnotationDescriptor( + annotation: JavaAnnotation, + c: LazyJavaResolverContext +): AbstractJavaAnnotationDescriptor(annotation, c.module.builtIns.deprecatedAnnotation) { + + private val valueArguments = c.storageManager.createLazyValue { + val parameterDescriptor = valueParameters.firstOrNull { + it.name == JvmAnnotationNames.DEFAULT_ANNOTATION_MEMBER_NAME + } + parameterDescriptor?.let { mapOf(it to ConstantValueFactory(c.module.builtIns).createConstantValue("Deprecated in Java")) } ?: emptyMap() + } + + override fun getAllValueArguments() = valueArguments() +} + class JavaRetentionAnnotationDescriptor( annotation: JavaAnnotation, c: LazyJavaResolverContext diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt index 7be9187d8cb..7f1b30a0a6f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt @@ -38,11 +38,6 @@ import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.utils.keysToMapExceptNulls import org.jetbrains.kotlin.utils.valuesToMap -private object DEPRECATED_IN_JAVA : JavaLiteralAnnotationArgument { - override val name: Name? = null - override val value: Any? = "Deprecated in Java" -} - fun LazyJavaResolverContext.resolveAnnotation(annotation: JavaAnnotation): LazyJavaAnnotationDescriptor? { val classId = annotation.getClassId() if (classId == null || isSpecialAnnotation(classId, !PLATFORM_TYPES)) return null @@ -79,7 +74,7 @@ class LazyJavaAnnotationDescriptor( val constructors = getAnnotationClass().getConstructors() if (constructors.isEmpty()) return mapOf() - val nameToArg = nameToArgument() + val nameToArg = javaAnnotation.getArguments().valuesToMap { it.name } return constructors.first().getValueParameters().keysToMapExceptNulls { valueParameter -> var javaAnnotationArgument = nameToArg[valueParameter.getName()] @@ -91,14 +86,6 @@ class LazyJavaAnnotationDescriptor( } } - private fun nameToArgument(): Map { - var arguments = javaAnnotation.getArguments() - if (arguments.isEmpty() && fqName()?.asString() == "java.lang.Deprecated") { - arguments = listOf(DEPRECATED_IN_JAVA) - } - return arguments.valuesToMap { it.name } - } - private fun getAnnotationClass() = getType().getConstructor().getDeclarationDescriptor() as ClassDescriptor private fun resolveAnnotationArgument(argument: JavaAnnotationArgument?): ConstantValue<*>? { diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java index f60e27cb0e5..604642a2805 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JavaToKotlinClassMap.java @@ -85,15 +85,12 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap { addKotlinToJava(new FqNameUnsafe(kFun + i), ClassId.topLevel(new FqName(kFun))); } - addJavaToKotlin(classId(Deprecated.class), builtIns.getDeprecatedAnnotation()); - addKotlinToJava(builtIns.getNothing(), classId(Void.class)); } /** * E.g. * java.lang.String -> kotlin.String - * java.lang.Deprecated -> kotlin.deprecated * java.lang.Integer -> kotlin.Int * kotlin.jvm.internal.IntCompanionObject -> kotlin.Int.Companion * java.util.List -> kotlin.List diff --git a/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParamsAnnotations.java b/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParamsAnnotations.java index 093e6339b1f..af4853b1706 100644 --- a/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParamsAnnotations.java +++ b/j2k/testData/fileOrElement/constructors/fieldsInitializedFromParamsAnnotations.java @@ -1,4 +1,3 @@ -import java.lang.Deprecated; import java.lang.SuppressWarnings; class C {