From 5c64ad93f83c799cf4d14b6b5d54f3286596d44b Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 28 Oct 2013 14:22:55 +0400 Subject: [PATCH] Properly map annotation classes and account for @Deprecated --- .../LazyJavaAnnotationDescriptor.kt | 18 +++++++++++++++--- .../java/mapping/JavaToKotlinClassMap.java | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt index e84ae094c48..21af629c63a 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt @@ -32,23 +32,35 @@ import org.jetbrains.jet.utils.keysToMapExceptNulls import org.jetbrains.jet.lang.resolve.java.lazy.types.toAttributes import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver import org.jetbrains.jet.renderer.DescriptorRenderer +import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap + +private object DEPRECATED_IN_JAVA : JavaLiteralAnnotationArgument { + override fun getName(): Name? = null + override fun getValue(): Any? = "Deprecated in Java" +} class LazyJavaAnnotationDescriptor( private val c: LazyJavaResolverContextWithTypes, val javaAnnotation : JavaAnnotation ) : AnnotationDescriptor { + private val _fqName = c.storageManager.createNullableLazyValue { javaAnnotation.getFqName() } private val _type = c.storageManager.createLazyValue {() : JetType -> - val fqName = javaAnnotation.getFqName() + val fqName = _fqName() if (fqName == null) return@createLazyValue ErrorUtils.createErrorType("No fqName: $javaAnnotation") - val annotationClass = c.javaClassResolver.resolveClassByFqName(fqName) + val annotationClass = JavaToKotlinClassMap.getInstance().mapKotlinClass(fqName, TypeUsage.MEMBER_SIGNATURE_INVARIANT) + ?: c.javaClassResolver.resolveClassByFqName(fqName) annotationClass?.getDefaultType() ?: ErrorUtils.createErrorType(fqName.asString()) } override fun getType(): JetType = _type() private val _nameToArgument = c.storageManager.createLazyValue { - javaAnnotation.getArguments().valuesToMap { a -> a.getName() } + var arguments: Collection = javaAnnotation.getArguments() + if (arguments.isEmpty() && _fqName() == JavaToKotlinClassMap.JAVA_LANG_DEPRECATED) { + arguments = listOf(DEPRECATED_IN_JAVA) + } + arguments.valuesToMap { a -> a.getName() } } private val _valueArguments = c.storageManager.createMemoizedFunctionWithNullableValues> { diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java index c55e5d2e534..0064f5014d1 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java @@ -41,7 +41,7 @@ import java.util.*; import static org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils.fqNameByClass; public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements PlatformToKotlinClassMap { - private static final FqName JAVA_LANG_DEPRECATED = new FqName("java.lang.Deprecated"); + public static final FqName JAVA_LANG_DEPRECATED = new FqName("java.lang.Deprecated"); private static JavaToKotlinClassMap instance = null;