diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/syntheticAccessorUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/syntheticAccessorUtil.kt index a3f1d0342a9..078c77865d9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/syntheticAccessorUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/syntheticAccessorUtil.kt @@ -33,7 +33,8 @@ private fun CallableMemberDescriptor.getJvmName() = fun getAccessorNameSuffix( descriptor: CallableMemberDescriptor, superCallDescriptor: ClassDescriptor?, accessorKind: AccessorKind ): String { - if (accessorKind == AccessorKind.JVM_DEFAULT_COMPATIBILITY) return descriptor.getJvmName() + "$" + AccessorKind.JVM_DEFAULT_COMPATIBILITY.suffix + if (accessorKind == AccessorKind.JVM_DEFAULT_COMPATIBILITY) + return descriptor.getJvmName() + "$" + AccessorKind.JVM_DEFAULT_COMPATIBILITY.suffix val suffix = when (descriptor) { is ConstructorDescriptor -> @@ -45,5 +46,9 @@ fun getAccessorNameSuffix( else -> throw UnsupportedOperationException("Do not know how to create accessor for descriptor $descriptor") } - return if (superCallDescriptor == null) suffix else "$suffix\$s${superCallDescriptor.name.asString().hashCode()}" + return if (superCallDescriptor == null) suffix else "$suffix\$s${superCallDescriptor.syntheticAccessorToSuperSuffix()}" } + +fun ClassDescriptor.syntheticAccessorToSuperSuffix(): String = + // TODO: change this to `fqNameUnsafe.asString().replace(".", "_")` as soon as we're ready to break compatibility with pre-KT-21178 code + name.asString().hashCode().toString() 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 fa0c71b0ecc..d03a95e312b 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 @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.backend.jvm.ir.IrInlineReferenceLocator import org.jetbrains.kotlin.backend.jvm.ir.hasJvmDefault import org.jetbrains.kotlin.backend.jvm.ir.isLambda import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.hasMangledParameters +import org.jetbrains.kotlin.codegen.syntheticAccessorToSuperSuffix import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility @@ -467,11 +468,11 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle parentAsClass.isJvmInterface -> if (!Visibilities.isPrivate(visibility) && hasJvmDefault()) "\$jd" else "" // Accessor for _s_uper-qualified call - superQualifier != null -> "\$s" + superQualifier.descriptor.name.asString().hashCode() + superQualifier != null -> "\$s" + superQualifier.descriptor.syntheticAccessorToSuperSuffix() // Access to static members that need an accessor must be because they are inherited, // hence accessed on a _s_upertype. - isStatic -> "\$s" + hashForAccessorDisambiguation() + isStatic -> "\$s" + parentAsClass.descriptor.syntheticAccessorToSuperSuffix() else -> "" } @@ -496,17 +497,10 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle // Static accesses that need an accessor must be due to being inherited, hence accessed on a // _s_upertype - val staticSuffix = if (isStatic) "\$s"+ hashForAccessorDisambiguation() else "" + val staticSuffix = if (isStatic) "\$s" + parentAsClass.descriptor.syntheticAccessorToSuperSuffix() else "" return companionSuffix + staticSuffix } - private fun IrDeclaration.hashForAccessorDisambiguation() = - if (parentAsClass.name.isSpecial) { - context.getLocalClassType(parentAsClass)?.className.hashCode() ?: parentAsClass.name.hashCode() - } else { - parentAsClass.name.identifier.hashCode() - } - private val Visibility.isPrivate get() = Visibilities.isPrivate(this)