From d901ceb73447c74b800c40c4c8c92e8c72d78fa7 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Tue, 2 Feb 2021 13:27:59 +0300 Subject: [PATCH] FIR: Fix loading Java annotations with Class[]-typed methods --- ...irOldFrontendDiagnosticsTestGenerated.java | 6 +++++ .../jetbrains/kotlin/fir/java/JavaUtils.kt | 18 +++++++-------- .../enhancement/EnhancementSignatureParts.kt | 4 ++-- .../java/enhancement/SignatureEnhancement.kt | 7 ++++-- .../kClassMapping/arrayClassParameter.kt | 1 - .../arrayClassParameterOnJavaClass.kt | 1 - .../kClassMapping/classParameter.kt | 1 - .../classParameterOnJavaClass.kt | 1 - .../kClassMapping/varargClassParameter.kt | 1 - .../varargClassParameterOnJavaClass.kt | 1 - .../reflection/classArrayInAnnotation.kt | 22 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++++ 12 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/reflection/classArrayInAnnotation.kt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index ee633872c72..d1264c7f054 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -34513,6 +34513,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/reflection"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("classArrayInAnnotation.kt") + public void testClassArrayInAnnotation() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/reflection/classArrayInAnnotation.kt"); + } + @Test @TestMetadata("noReflectionInClassPath.kt") public void testNoReflectionInClassPath() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index 4525b835cc9..79f82b3c134 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -125,7 +125,7 @@ internal fun JavaClassifierType.toFirResolvedTypeRef( internal fun JavaType?.toConeKotlinTypeWithoutEnhancement( session: FirSession, javaTypeParameterStack: JavaTypeParameterStack, - forAnnotationValueParameter: Boolean = false, + forAnnotationMember: Boolean = false, isForSupertypes: Boolean = false, attributes: ConeAttributes = ConeAttributes.Empty ): ConeKotlinType { @@ -134,7 +134,7 @@ internal fun JavaType?.toConeKotlinTypeWithoutEnhancement( toConeKotlinTypeWithoutEnhancement( session, javaTypeParameterStack, - forAnnotationValueParameter = forAnnotationValueParameter, + forAnnotationMember = forAnnotationMember, attributes = attributes ) } @@ -152,7 +152,7 @@ internal fun JavaType?.toConeKotlinTypeWithoutEnhancement( toConeKotlinTypeWithoutEnhancement( session, javaTypeParameterStack, - forAnnotationValueParameter, + forAnnotationMember, isForSupertypes, attributes = attributes ) @@ -225,7 +225,7 @@ private fun JavaClassifierType.toConeKotlinTypeWithoutEnhancement( javaTypeParameterStack: JavaTypeParameterStack, forTypeParameterBounds: Boolean = false, isForSupertypes: Boolean = false, - forAnnotationValueParameter: Boolean = false, + forAnnotationMember: Boolean = false, attributes: ConeAttributes = ConeAttributes.Empty ): ConeKotlinType { val lowerBound = toConeKotlinTypeForFlexibleBound( @@ -234,10 +234,10 @@ private fun JavaClassifierType.toConeKotlinTypeWithoutEnhancement( isLowerBound = true, forTypeParameterBounds, isForSupertypes, - forAnnotationValueParameter = forAnnotationValueParameter, + forAnnotationMember = forAnnotationMember, attributes = attributes ) - if (forAnnotationValueParameter) { + if (forAnnotationMember) { return lowerBound } val upperBound = @@ -248,7 +248,7 @@ private fun JavaClassifierType.toConeKotlinTypeWithoutEnhancement( forTypeParameterBounds, isForSupertypes, lowerBound, - forAnnotationValueParameter = forAnnotationValueParameter, + forAnnotationMember = forAnnotationMember, attributes = attributes ) @@ -362,13 +362,13 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound( forTypeParameterBounds: Boolean, isForSupertypes: Boolean, lowerBound: ConeLookupTagBasedType? = null, - forAnnotationValueParameter: Boolean = false, + forAnnotationMember: Boolean = false, attributes: ConeAttributes = ConeAttributes.Empty ): ConeLookupTagBasedType { return when (val classifier = classifier) { is JavaClass -> { //val classId = classifier.classId!! - var classId = if (forAnnotationValueParameter) { + var classId = if (forAnnotationMember) { JavaToKotlinClassMap.mapJavaToKotlinIncludingClassMapping(classifier.fqName!!) } else { JavaToKotlinClassMap.mapJavaToKotlin(classifier.fqName!!) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancementSignatureParts.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancementSignatureParts.kt index cf0c7b726aa..9493af4e75f 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancementSignatureParts.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancementSignatureParts.kt @@ -51,7 +51,7 @@ internal class EnhancementSignatureParts( session: FirSession, javaTypeEnhancementState: JavaTypeEnhancementState, predefined: TypeEnhancementInfo? = null, - forAnnotationValueParameter: Boolean = false + forAnnotationMember: Boolean = false ): PartEnhancementResult { val qualifiers = computeIndexedQualifiersForOverride(session, javaTypeEnhancementState) @@ -64,7 +64,7 @@ internal class EnhancementSignatureParts( val typeWithoutEnhancement = current.type.toConeKotlinTypeWithoutEnhancement( session, javaTypeParameterStack, - forAnnotationValueParameter, + forAnnotationMember, attributes = attributesCache.getValue(current) ) val containsFunctionN = typeWithoutEnhancement.contains { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index 492cdf6937c..f139b9ab77b 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -319,7 +319,7 @@ class FirSignatureEnhancement( session, jsr305State, predefinedEnhancementInfo?.parametersInfo?.getOrNull(index), - forAnnotationValueParameter = owner.classKind == ClassKind.ANNOTATION_CLASS + forAnnotationMember = owner.classKind == ClassKind.ANNOTATION_CLASS ) val firResolvedTypeRef = signatureParts.type val defaultValueExpression = when (val defaultValue = ownerParameter.getDefaultValueFromAnnotation()) { @@ -345,7 +345,10 @@ class FirSignatureEnhancement( if (owner is FirJavaField) AnnotationQualifierApplicabilityType.FIELD else AnnotationQualifierApplicabilityType.METHOD_RETURN_TYPE, typeInSignature = TypeInSignature.Return - ).enhance(session, jsr305State, predefinedEnhancementInfo?.returnTypeInfo) + ).enhance( + session, jsr305State, predefinedEnhancementInfo?.returnTypeInfo, + forAnnotationMember = this.owner.classKind == ClassKind.ANNOTATION_CLASS + ) return signatureParts.type } diff --git a/compiler/testData/codegen/annotations/kClassMapping/arrayClassParameter.kt b/compiler/testData/codegen/annotations/kClassMapping/arrayClassParameter.kt index bcefb58aeeb..8377311afd6 100644 --- a/compiler/testData/codegen/annotations/kClassMapping/arrayClassParameter.kt +++ b/compiler/testData/codegen/annotations/kClassMapping/arrayClassParameter.kt @@ -1,5 +1,4 @@ // DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // MODULE: lib // FILE: JavaAnn.java diff --git a/compiler/testData/codegen/annotations/kClassMapping/arrayClassParameterOnJavaClass.kt b/compiler/testData/codegen/annotations/kClassMapping/arrayClassParameterOnJavaClass.kt index 02ea4a13b89..2100ce410ef 100644 --- a/compiler/testData/codegen/annotations/kClassMapping/arrayClassParameterOnJavaClass.kt +++ b/compiler/testData/codegen/annotations/kClassMapping/arrayClassParameterOnJavaClass.kt @@ -1,5 +1,4 @@ // DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // MODULE: lib // FILE: JavaAnn.java diff --git a/compiler/testData/codegen/annotations/kClassMapping/classParameter.kt b/compiler/testData/codegen/annotations/kClassMapping/classParameter.kt index d1b7ce1e288..b54728cab96 100644 --- a/compiler/testData/codegen/annotations/kClassMapping/classParameter.kt +++ b/compiler/testData/codegen/annotations/kClassMapping/classParameter.kt @@ -1,5 +1,4 @@ // DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // MODULE: lib // FILE: JavaAnn.java diff --git a/compiler/testData/codegen/annotations/kClassMapping/classParameterOnJavaClass.kt b/compiler/testData/codegen/annotations/kClassMapping/classParameterOnJavaClass.kt index 66a70fa6993..5e6c8cbcc7f 100644 --- a/compiler/testData/codegen/annotations/kClassMapping/classParameterOnJavaClass.kt +++ b/compiler/testData/codegen/annotations/kClassMapping/classParameterOnJavaClass.kt @@ -1,5 +1,4 @@ // DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // MODULE: lib // FILE: JavaAnn.java diff --git a/compiler/testData/codegen/annotations/kClassMapping/varargClassParameter.kt b/compiler/testData/codegen/annotations/kClassMapping/varargClassParameter.kt index fd217472ad0..ed86fae9ae3 100644 --- a/compiler/testData/codegen/annotations/kClassMapping/varargClassParameter.kt +++ b/compiler/testData/codegen/annotations/kClassMapping/varargClassParameter.kt @@ -1,5 +1,4 @@ // DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // MODULE: lib // FILE: JavaAnn.java diff --git a/compiler/testData/codegen/annotations/kClassMapping/varargClassParameterOnJavaClass.kt b/compiler/testData/codegen/annotations/kClassMapping/varargClassParameterOnJavaClass.kt index a9a2ecc44fa..4b26501f38d 100644 --- a/compiler/testData/codegen/annotations/kClassMapping/varargClassParameterOnJavaClass.kt +++ b/compiler/testData/codegen/annotations/kClassMapping/varargClassParameterOnJavaClass.kt @@ -1,5 +1,4 @@ // DONT_TARGET_EXACT_BACKEND: JS JS_IR JS_IR_ES6 WASM NATIVE -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // MODULE: lib // FILE: JavaAnn.java diff --git a/compiler/testData/diagnostics/testsWithStdLib/reflection/classArrayInAnnotation.kt b/compiler/testData/diagnostics/testsWithStdLib/reflection/classArrayInAnnotation.kt new file mode 100644 index 00000000000..cbf4c0cbf49 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/reflection/classArrayInAnnotation.kt @@ -0,0 +1,22 @@ +// FIR_IDENTICAL +// SKIP_TXT +// FILE: MyAnn.java +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface MyAnn { + /** + * @return the classes to be run + */ + public Class[] value(); +} +// FILE: main.kt + +fun foo(y: MyAnn?): List>? { + return y?.value?.map { it.java } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index cff81485a8c..9c3a82d54f2 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -34609,6 +34609,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/reflection"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("classArrayInAnnotation.kt") + public void testClassArrayInAnnotation() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/reflection/classArrayInAnnotation.kt"); + } + @Test @TestMetadata("noReflectionInClassPath.kt") public void testNoReflectionInClassPath() throws Exception {