diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/AnnotationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/AnnotationGenerator.kt index aa67448e6b9..103c489ae08 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/AnnotationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/AnnotationGenerator.kt @@ -88,15 +88,17 @@ class AnnotationGenerator( fun generateAnnotationConstructorCall(annotationDescriptor: AnnotationDescriptor): IrCall { val annotationType = annotationDescriptor.type - val annotationClassDescriptor = annotationType.constructor.declarationDescriptor + val annotationClassDescriptor = annotationType.constructor.declarationDescriptor as? ClassDescriptor ?: throw AssertionError("No declaration descriptor for annotation $annotationDescriptor") assert(DescriptorUtils.isAnnotationClass(annotationClassDescriptor)) { "Annotation class expected: $annotationClassDescriptor" } val primaryConstructorDescriptor = - annotationClassDescriptor.safeAs()?.unsubstitutedPrimaryConstructor - ?: throw AssertionError("No primary constructor for annotation class $annotationClassDescriptor") + annotationClassDescriptor.unsubstitutedPrimaryConstructor + ?: annotationClassDescriptor.constructors.singleOrNull() + ?: throw AssertionError("No constructor for annotation class $annotationClassDescriptor") + val primaryConstructorSymbol = symbolTable.referenceConstructor(primaryConstructorDescriptor) val psi = annotationDescriptor.source.safeAs()?.psi diff --git a/compiler/testData/ir/irText/declarations/annotations/javaAnnotation.kt b/compiler/testData/ir/irText/declarations/annotations/javaAnnotation.kt new file mode 100644 index 00000000000..53e4ca86bd0 --- /dev/null +++ b/compiler/testData/ir/irText/declarations/annotations/javaAnnotation.kt @@ -0,0 +1,16 @@ +// FILE: JavaAnn.java +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JavaAnn { + String value() default ""; + int i() default 0; +} + +// FILE: javaAnnotation.kt +@JavaAnn fun test1() {} + +@JavaAnn(value="abc", i=123) fun test2() {} + +@JavaAnn(i=123, value="abc") fun test3() {} diff --git a/compiler/testData/ir/irText/declarations/annotations/javaAnnotation.txt b/compiler/testData/ir/irText/declarations/annotations/javaAnnotation.txt new file mode 100644 index 00000000000..3a8c3f3566c --- /dev/null +++ b/compiler/testData/ir/irText/declarations/annotations/javaAnnotation.txt @@ -0,0 +1,17 @@ +FILE fqName: fileName:/javaAnnotation.kt + FUN name:test1 visibility:public modality:FINAL <> () returnType:Unit flags: + annotations: + CALL 'constructor JavaAnn(String = ..., Int = ...)' type=JavaAnn origin=null + BLOCK_BODY + FUN name:test2 visibility:public modality:FINAL <> () returnType:Unit flags: + annotations: + CALL 'constructor JavaAnn(String = ..., Int = ...)' type=JavaAnn origin=null + value: CONST String type=kotlin.String value=abc + i: CONST Int type=kotlin.Int value=123 + BLOCK_BODY + FUN name:test3 visibility:public modality:FINAL <> () returnType:Unit flags: + annotations: + CALL 'constructor JavaAnn(String = ..., Int = ...)' type=JavaAnn origin=null + value: CONST String type=kotlin.String value=abc + i: CONST Int type=kotlin.Int value=123 + BLOCK_BODY diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index b4238156213..1f95e6ebb46 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -381,6 +381,11 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { runTest("compiler/testData/ir/irText/declarations/annotations/functionsWithAnnotations.kt"); } + @TestMetadata("javaAnnotation.kt") + public void testJavaAnnotation() throws Exception { + runTest("compiler/testData/ir/irText/declarations/annotations/javaAnnotation.kt"); + } + @TestMetadata("localDelegatedPropertiesWithAnnotations.kt") public void testLocalDelegatedPropertiesWithAnnotations() throws Exception { runTest("compiler/testData/ir/irText/declarations/annotations/localDelegatedPropertiesWithAnnotations.kt");