Fix annotations on Java elements in reflection
#KT-10840 Fixed
This commit is contained in:
+11
@@ -0,0 +1,11 @@
|
|||||||
|
@Anno("J")
|
||||||
|
public class J {
|
||||||
|
@Anno("foo")
|
||||||
|
public static int foo = 42;
|
||||||
|
|
||||||
|
@Anno("bar")
|
||||||
|
public static void bar() {}
|
||||||
|
|
||||||
|
@Anno("constructor")
|
||||||
|
public J() {}
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
annotation class Anno(val value: String)
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
assertEquals("[@Anno(value=J)]", J::class.annotations.toString())
|
||||||
|
assertEquals("[@Anno(value=foo)]", J::foo.annotations.toString())
|
||||||
|
assertEquals("[@Anno(value=bar)]", J::bar.annotations.toString())
|
||||||
|
assertEquals("[@Anno(value=constructor)]", ::J.annotations.toString())
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+6
@@ -581,6 +581,12 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithJava/reflection"), Pattern.compile("^([^\\.]+)$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithJava/reflection"), Pattern.compile("^([^\\.]+)$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("annotationsOnJavaMembers")
|
||||||
|
public void testAnnotationsOnJavaMembers() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/reflection/annotationsOnJavaMembers/");
|
||||||
|
doTestWithJava(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("callInstanceJavaMethod")
|
@TestMetadata("callInstanceJavaMethod")
|
||||||
public void testCallInstanceJavaMethod() throws Exception {
|
public void testCallInstanceJavaMethod() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/reflection/callInstanceJavaMethod/");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxWithJava/reflection/callInstanceJavaMethod/");
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaElement
|
|||||||
import org.jetbrains.kotlin.load.java.structure.reflect.ReflectJavaElement
|
import org.jetbrains.kotlin.load.java.structure.reflect.ReflectJavaElement
|
||||||
|
|
||||||
object RuntimeSourceElementFactory : JavaSourceElementFactory {
|
object RuntimeSourceElementFactory : JavaSourceElementFactory {
|
||||||
private class RuntimeSourceElement(override val javaElement: ReflectJavaElement) : JavaSourceElement {
|
class RuntimeSourceElement(override val javaElement: ReflectJavaElement) : JavaSourceElement {
|
||||||
override fun toString() = javaClass.name + ": " + javaElement.toString()
|
override fun toString() = javaClass.name + ": " + javaElement.toString()
|
||||||
override fun getContainingFile(): SourceFile = SourceFile.NO_SOURCE_FILE
|
override fun getContainingFile(): SourceFile = SourceFile.NO_SOURCE_FILE
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaAnnotationArgument
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
|
|
||||||
class ReflectJavaAnnotation(private val annotation: Annotation) : ReflectJavaElement(), JavaAnnotation {
|
class ReflectJavaAnnotation(val annotation: Annotation) : ReflectJavaElement(), JavaAnnotation {
|
||||||
override fun findArgument(name: Name): JavaAnnotationArgument? {
|
override fun findArgument(name: Name): JavaAnnotationArgument? {
|
||||||
return getArgumentValue(annotation.annotationClass.java.getDeclaredMethod(name.asString()))
|
return getArgumentValue(annotation.annotationClass.java.getDeclaredMethod(name.asString()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
package kotlin.reflect.jvm.internal
|
package kotlin.reflect.jvm.internal
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotated
|
import org.jetbrains.kotlin.descriptors.annotations.Annotated
|
||||||
|
import org.jetbrains.kotlin.load.java.components.RuntimeSourceElementFactory
|
||||||
|
import org.jetbrains.kotlin.load.java.structure.reflect.ReflectJavaAnnotation
|
||||||
import org.jetbrains.kotlin.load.kotlin.reflect.ReflectAnnotationSource
|
import org.jetbrains.kotlin.load.kotlin.reflect.ReflectAnnotationSource
|
||||||
import kotlin.reflect.KAnnotatedElement
|
import kotlin.reflect.KAnnotatedElement
|
||||||
|
|
||||||
@@ -24,7 +26,16 @@ internal interface KAnnotatedElementImpl : KAnnotatedElement {
|
|||||||
val annotated: Annotated
|
val annotated: Annotated
|
||||||
|
|
||||||
override val annotations: List<Annotation>
|
override val annotations: List<Annotation>
|
||||||
get() = annotated.annotations.map {
|
get() = annotated.annotations.mapNotNull {
|
||||||
(it.source as? ReflectAnnotationSource)?.annotation
|
val source = it.source
|
||||||
}.filterNotNull()
|
when (source) {
|
||||||
|
is ReflectAnnotationSource -> {
|
||||||
|
source.annotation
|
||||||
|
}
|
||||||
|
is RuntimeSourceElementFactory.RuntimeSourceElement -> {
|
||||||
|
(source.javaElement as? ReflectJavaAnnotation)?.annotation
|
||||||
|
}
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user