From cd0c45c8328f41f2b2e22d18f16acfb97d8bf4dc Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Thu, 30 Jan 2020 16:49:10 +0100 Subject: [PATCH] JVM_IR. Generate proper suffix for companion backing field accessor and parameter name --- .../kotlin/backend/jvm/DeclarationOrigins.kt | 1 + .../jvm/descriptors/JvmDeclarationFactory.kt | 2 +- .../backend/jvm/lower/SyntheticAccessorLowering.kt | 14 ++++++-------- .../codegen/asmLike/typeAnnotations/property.kt | 1 - 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt index 60130b08bb0..c71a511c3e4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/DeclarationOrigins.kt @@ -45,4 +45,5 @@ interface JvmLoweredDeclarationOrigin : IrDeclarationOrigin { object FOR_INLINE_STATE_MACHINE_TEMPLATE : IrDeclarationOriginImpl("FOR_INLINE_TEMPLATE") object FOR_INLINE_STATE_MACHINE_TEMPLATE_CAPTURES_CROSSINLINE : IrDeclarationOriginImpl("FOR_INLINE_TEMPLATE_CROSSINLINE") object FOR_INLINE_STATE_MACHINE_TEMPLATE_CAPTURES_CROSSINLINE_VIEW : IrDeclarationOriginImpl("FOR_INLINE_TEMPLATE_CROSSINLINE_VIEW") + object COMPANION_PROPERTY_BACKING_FIELD : IrDeclarationOriginImpl("COMPANION_MOVED_PROPERTY_BACKING_FIELD") } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt index a78b64d4484..a5363032531 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDeclarationFactory.kt @@ -26,7 +26,6 @@ import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.symbols.impl.* -import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.load.java.JvmAbi @@ -181,6 +180,7 @@ class JvmDeclarationFactory( initializer = oldField.initializer ?.replaceThisByStaticReference(this@JvmDeclarationFactory, oldParent, oldParent.thisReceiver!!) ?.patchDeclarationParents(this) as IrExpressionBody? + origin = if (irProperty.parentAsClass.isCompanion) JvmLoweredDeclarationOrigin.COMPANION_PROPERTY_BACKING_FIELD else origin } } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index c8618115ccb..ca7f9b58c9a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext -import org.jetbrains.kotlin.backend.common.descriptors.synthesizedName import org.jetbrains.kotlin.backend.common.descriptors.synthesizedString import org.jetbrains.kotlin.backend.common.ir.* import org.jetbrains.kotlin.backend.jvm.JvmBackendContext @@ -322,7 +321,7 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle ) } - accessor.addValueParameter("value", fieldSymbol.owner.type, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR) + accessor.addValueParameter("", fieldSymbol.owner.type, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR) accessor.body = createAccessorBodyForSetter(fieldSymbol.owner, accessor) }.symbol @@ -492,15 +491,14 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle } private fun IrField.fieldAccessorSuffix(): String { - // The only static field accessors are those for fields moved from companion objects, hence a - // _c_ompanion _p_roperty suffix. However, companion objects for interfaces keep their fields - // (as interfaces cannot own fields), hence are simple _p_roperty accessors, like everything else. - val companionSuffix = if (isStatic && !parentAsClass.isCompanion) "cp" else "p" + // Special _c_ompanion _p_roperty suffix for accessing companion backing field moved to outer + if (origin == JvmLoweredDeclarationOrigin.COMPANION_PROPERTY_BACKING_FIELD && !parentAsClass.isCompanion) { + return "cp" + } // Static accesses that need an accessor must be due to being inherited, hence accessed on a // _s_upertype - val staticSuffix = if (isStatic) "\$s" + parentAsClass.descriptor.syntheticAccessorToSuperSuffix() else "" - return companionSuffix + staticSuffix + return "p" + if (isStatic) "\$s" + parentAsClass.descriptor.syntheticAccessorToSuperSuffix() else "" } private val Visibility.isPrivate diff --git a/compiler/testData/codegen/asmLike/typeAnnotations/property.kt b/compiler/testData/codegen/asmLike/typeAnnotations/property.kt index c300ba01475..d13f62aca03 100644 --- a/compiler/testData/codegen/asmLike/typeAnnotations/property.kt +++ b/compiler/testData/codegen/asmLike/typeAnnotations/property.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // KOTLIN_CONFIGURATION_FLAGS: +JVM.EMIT_JVM_TYPE_ANNOTATIONS // TYPE_ANNOTATIONS // IGNORE_BACKEND_FIR: JVM_IR