From c6b91b0f8168026fd9351d1fab67045155a1b755 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 7 May 2015 21:58:22 +0300 Subject: [PATCH] Java type annotations supported in LazyJavaTypeResolver --- .../java/structure/impl/JavaClassifierImpl.java | 2 +- .../loadJava/sourceJava/TypeAnnotations.java | 16 ++++++++++++++++ .../loadJava/sourceJava/TypeAnnotations.txt | 6 ++++++ .../jvm/compiler/LoadJavaTestGenerated.java | 6 ++++++ .../load/java/lazy/types/LazyJavaTypeResolver.kt | 5 ++++- .../descriptors/annotations/Annotations.kt | 12 ++++++++++++ 6 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/loadJava/sourceJava/TypeAnnotations.java create mode 100644 compiler/testData/loadJava/sourceJava/TypeAnnotations.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassifierImpl.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassifierImpl.java index f94bd71652e..2d43b64ab63 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassifierImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassifierImpl.java @@ -32,7 +32,7 @@ public abstract class JavaClassifierImpl extends JavaEleme super(psiClass); } - @NotNull + @Nullable @Override public PsiAnnotationOwner getAnnotationOwnerPsi() { return getPsi().getModifierList(); diff --git a/compiler/testData/loadJava/sourceJava/TypeAnnotations.java b/compiler/testData/loadJava/sourceJava/TypeAnnotations.java new file mode 100644 index 00000000000..30516b4fbb9 --- /dev/null +++ b/compiler/testData/loadJava/sourceJava/TypeAnnotations.java @@ -0,0 +1,16 @@ +package test; + +import java.lang.annotation.*; + +@Target(ElementType.TYPE_USE) +@interface A { + String value() default ""; +} + +interface G {} +interface G2 {} + +public interface TypeAnnotations { + void f(G<@A String> p); + void f(G2<@A String, @A Integer> p); +} \ No newline at end of file diff --git a/compiler/testData/loadJava/sourceJava/TypeAnnotations.txt b/compiler/testData/loadJava/sourceJava/TypeAnnotations.txt new file mode 100644 index 00000000000..8021ab11fcc --- /dev/null +++ b/compiler/testData/loadJava/sourceJava/TypeAnnotations.txt @@ -0,0 +1,6 @@ +package test + +public interface TypeAnnotations { + public abstract fun f(/*0*/ p: test.G2<@[test.A()] kotlin.String!, @[test.A()] kotlin.Int!>!): kotlin.Unit + public abstract fun f(/*0*/ p: test.G<@[test.A()] kotlin.String!>!): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index dece7cfbdba..76e902d4c03 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -5156,6 +5156,12 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestSourceJava(fileName); } + @TestMetadata("TypeAnnotations.java") + public void testTypeAnnotations() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/sourceJava/TypeAnnotations.java"); + doTestSourceJava(fileName); + } + @TestMetadata("WrongNumberOfGenericParameters.java") public void testWrongNumberOfGenericParameters() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/sourceJava/WrongNumberOfGenericParameters.java"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt index cbe1b646dcc..c53b66ebf50 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt @@ -20,10 +20,12 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations import org.jetbrains.kotlin.descriptors.annotations.FilteredAnnotations import org.jetbrains.kotlin.load.java.JvmAnnotationNames.* import org.jetbrains.kotlin.load.java.components.TypeUsage import org.jetbrains.kotlin.load.java.components.TypeUsage.* +import org.jetbrains.kotlin.load.java.lazy.LazyJavaAnnotations import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext import org.jetbrains.kotlin.load.java.lazy.TypeParameterResolver import org.jetbrains.kotlin.load.java.lazy.types.JavaTypeFlexibility.FLEXIBLE_LOWER_BOUND @@ -110,6 +112,7 @@ class LazyJavaTypeResolver( private val javaType: JavaClassifierType, private val attr: JavaTypeAttributes ) : AbstractLazyType(c.storageManager) { + private val annotations = CompositeAnnotations(listOf(LazyJavaAnnotations(c, javaType), attr.typeAnnotations)) private val classifier = c.storageManager.createNullableLazyValue { javaType.getClassifier() } @@ -291,7 +294,7 @@ class LazyJavaTypeResolver( override fun isMarkedNullable(): Boolean = nullable() - override fun getAnnotations() = attr.typeAnnotations + override fun getAnnotations() = annotations } public object FlexibleJavaClassifierTypeCapabilities : FlexibleTypeCapabilities { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt index 6396fa9d4e7..d6627b229fb 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt @@ -65,3 +65,15 @@ class FilteredAnnotations( override fun isEmpty() = !iterator().hasNext() } + +class CompositeAnnotations( + private val delegates: List +) : Annotations { + override fun isEmpty() = delegates.all { it.isEmpty() } + + override fun findAnnotation(fqName: FqName) = delegates.asSequence().map { it.findAnnotation(fqName) }.filterNotNull().firstOrNull() + + override fun findExternalAnnotation(fqName: FqName) = delegates.asSequence().map { it.findExternalAnnotation(fqName) }.filterNotNull().firstOrNull() + + override fun iterator() = delegates.asSequence().flatMap { it.asSequence() }.iterator() +} \ No newline at end of file