From 69033b7b152b62a3803e33043ae74d58b54a08b8 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 2 Dec 2019 16:55:44 +0100 Subject: [PATCH] JVM_IR: handle @JvmName on annotation getters --- .../backend/jvm/codegen/AnnotationCodegen.kt | 19 ++++++++++--------- .../jvm/codegen/MethodSignatureMapper.kt | 3 --- .../box/jvmName/annotationProperties.kt | 1 - .../compileKotlinAgainstKotlin/jvmNames.kt | 1 - 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt index ad218748e01..cb35841c3c4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/AnnotationCodegen.kt @@ -32,10 +32,7 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.classifierOrNull import org.jetbrains.kotlin.ir.types.isMarkedNullable import org.jetbrains.kotlin.ir.types.isNullable -import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable -import org.jetbrains.kotlin.ir.util.getAnnotation -import org.jetbrains.kotlin.ir.util.isAnnotationClass -import org.jetbrains.kotlin.ir.util.parentAsClass +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.synthetic.isVisibleOutside @@ -185,11 +182,15 @@ class AnnotationCodegen( private fun getAnnotationArgumentJvmName(annotationClass: IrClass?, parameterName: Name): String { if (annotationClass == null) return parameterName.asString() - val field = - annotationClass.declarations.filterIsInstance().singleOrNull { it.name == parameterName } - ?: return parameterName.asString() - - return methodSignatureMapper.mapAnnotationParameterName(field) + val propertyOrGetter = annotationClass.declarations.singleOrNull { + // IrSimpleFunction if lowered, IrProperty with a getter if imported + (it is IrSimpleFunction && it.correspondingPropertySymbol?.owner?.name == parameterName) || + (it is IrProperty && it.name == parameterName) + } ?: return parameterName.asString() + val getter = propertyOrGetter as? IrSimpleFunction + ?: (propertyOrGetter as IrProperty).getter + ?: error("No getter for annotation property: ${propertyOrGetter.render()}") + return methodSignatureMapper.mapFunctionName(getter) } private fun genCompileTimeValue( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt index 2b29ba4efb1..a8d083e34a3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt @@ -125,9 +125,6 @@ class MethodSignatureMapper(private val context: JvmBackendContext) { private fun IrFunction.isPublishedApi(): Boolean = propertyIfAccessor.annotations.hasAnnotation(KotlinBuiltIns.FQ_NAMES.publishedApi) - fun mapAnnotationParameterName(field: IrField): String = - mapFunctionName(field.correspondingPropertySymbol!!.owner.getter ?: error("No getter for annotation property: ${field.render()}")) - fun mapReturnType(declaration: IrDeclaration, sw: JvmSignatureWriter? = null): Type { if (declaration !is IrFunction) { require(declaration is IrField) { "Unsupported declaration: $declaration" } diff --git a/compiler/testData/codegen/box/jvmName/annotationProperties.kt b/compiler/testData/codegen/box/jvmName/annotationProperties.kt index 6707c9c1c96..bd8bc9653e9 100644 --- a/compiler/testData/codegen/box/jvmName/annotationProperties.kt +++ b/compiler/testData/codegen/box/jvmName/annotationProperties.kt @@ -1,6 +1,5 @@ // IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM -// IGNORE_BACKEND: JVM_IR // WITH_REFLECT package test diff --git a/compiler/testData/compileKotlinAgainstKotlin/jvmNames.kt b/compiler/testData/compileKotlinAgainstKotlin/jvmNames.kt index 0d588dc21a1..a0f955970d4 100644 --- a/compiler/testData/compileKotlinAgainstKotlin/jvmNames.kt +++ b/compiler/testData/compileKotlinAgainstKotlin/jvmNames.kt @@ -1,5 +1,4 @@ // TARGET_BACKEND: JVM -// IGNORE_BACKEND: JVM_IR // FILE: A.kt package lib