Properly map annotation classes and account for @Deprecated
This commit is contained in:
+15
-3
@@ -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.lazy.types.toAttributes
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver
|
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver
|
||||||
import org.jetbrains.jet.renderer.DescriptorRenderer
|
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(
|
class LazyJavaAnnotationDescriptor(
|
||||||
private val c: LazyJavaResolverContextWithTypes,
|
private val c: LazyJavaResolverContextWithTypes,
|
||||||
val javaAnnotation : JavaAnnotation
|
val javaAnnotation : JavaAnnotation
|
||||||
) : AnnotationDescriptor {
|
) : AnnotationDescriptor {
|
||||||
|
|
||||||
|
private val _fqName = c.storageManager.createNullableLazyValue { javaAnnotation.getFqName() }
|
||||||
private val _type = c.storageManager.createLazyValue {() : JetType ->
|
private val _type = c.storageManager.createLazyValue {() : JetType ->
|
||||||
val fqName = javaAnnotation.getFqName()
|
val fqName = _fqName()
|
||||||
if (fqName == null) return@createLazyValue ErrorUtils.createErrorType("No fqName: $javaAnnotation")
|
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())
|
annotationClass?.getDefaultType() ?: ErrorUtils.createErrorType(fqName.asString())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getType(): JetType = _type()
|
override fun getType(): JetType = _type()
|
||||||
|
|
||||||
private val _nameToArgument = c.storageManager.createLazyValue {
|
private val _nameToArgument = c.storageManager.createLazyValue {
|
||||||
javaAnnotation.getArguments().valuesToMap { a -> a.getName() }
|
var arguments: Collection<JavaAnnotationArgument> = 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<ValueParameterDescriptor, CompileTimeConstant<out Any?>> {
|
private val _valueArguments = c.storageManager.createMemoizedFunctionWithNullableValues<ValueParameterDescriptor, CompileTimeConstant<out Any?>> {
|
||||||
|
|||||||
+1
-1
@@ -41,7 +41,7 @@ import java.util.*;
|
|||||||
import static org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils.fqNameByClass;
|
import static org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils.fqNameByClass;
|
||||||
|
|
||||||
public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements PlatformToKotlinClassMap {
|
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;
|
private static JavaToKotlinClassMap instance = null;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user