[FIR, IR] Fix name mangling for functions with context receivers

- Mangled names of property accessors now include context receiver
  types of the corresponding property when computed from FIR.
- Context receivers are now supported when computing mangled names
  from IR
- IrBasedDescriptors now account for context receivers

^KT-57435 Fixed
This commit is contained in:
Sergej Jaskiewicz
2023-04-11 17:23:10 +02:00
committed by Space Team
parent 5700212119
commit 1a29b9efff
56 changed files with 120 additions and 199 deletions
@@ -396,10 +396,27 @@ open class IrBasedVariableDescriptorWithAccessor(owner: IrLocalDelegatedProperty
fun IrLocalDelegatedProperty.toIrBasedDescriptor() = IrBasedVariableDescriptorWithAccessor(this)
abstract class IrBasedFunctionDescriptor<Function : IrFunction>(owner: Function) : IrBasedCallableDescriptor<Function>(owner) {
override fun getExtensionReceiverParameter() = owner.extensionReceiverParameter?.toIrBasedDescriptor() as? ReceiverParameterDescriptor
override fun getContextReceiverParameters() = owner.valueParameters
.asSequence()
.take(owner.contextReceiverParametersCount)
.map(::IrBasedReceiverParameterDescriptor)
.toMutableList()
override fun getValueParameters() = owner.valueParameters
.asSequence()
.drop(owner.contextReceiverParametersCount)
.map(::IrBasedValueParameterDescriptor)
.toMutableList()
}
// We make all IR-based function descriptors instances of DescriptorWithContainerSource, and use .parentClassId to
// check whether declaration is deserialized. See IrInlineCodegen.descriptorIsDeserialized
open class IrBasedSimpleFunctionDescriptor(owner: IrSimpleFunction) : SimpleFunctionDescriptor, DescriptorWithContainerSource,
IrBasedCallableDescriptor<IrSimpleFunction>(owner) {
IrBasedFunctionDescriptor<IrSimpleFunction>(owner) {
override fun getOverriddenDescriptors(): List<FunctionDescriptor> = owner.overriddenSymbols.memoryOptimizedMap { it.owner.toIrBasedDescriptor() }
@@ -412,12 +429,7 @@ open class IrBasedSimpleFunctionDescriptor(owner: IrSimpleFunction) : SimpleFunc
(containingDeclaration as ClassDescriptor).thisAsReceiverParameter
}
override fun getExtensionReceiverParameter() = owner.extensionReceiverParameter?.toIrBasedDescriptor() as? ReceiverParameterDescriptor
override fun getTypeParameters() = owner.typeParameters.memoryOptimizedMap { it.toIrBasedDescriptor() }
override fun getValueParameters() = owner.valueParameters
.asSequence()
.mapNotNull { it.toIrBasedDescriptor() as? ValueParameterDescriptor }
.toMutableList()
override fun isExternal() = owner.isExternal
override fun isSuspend() = owner.isSuspend
@@ -482,7 +494,7 @@ fun IrSimpleFunction.toIrBasedDescriptor() =
}
open class IrBasedClassConstructorDescriptor(owner: IrConstructor) : ClassConstructorDescriptor,
IrBasedCallableDescriptor<IrConstructor>(owner) {
IrBasedFunctionDescriptor<IrConstructor>(owner) {
override fun getContainingDeclaration() = (owner.parent as IrClass).toIrBasedDescriptor()
override fun getDispatchReceiverParameter() = owner.dispatchReceiverParameter?.run {
@@ -492,10 +504,6 @@ open class IrBasedClassConstructorDescriptor(owner: IrConstructor) : ClassConstr
override fun getTypeParameters() =
(owner.constructedClass.typeParameters + owner.typeParameters).memoryOptimizedMap { it.toIrBasedDescriptor() }
override fun getValueParameters() = owner.valueParameters.asSequence()
.mapNotNull { it.toIrBasedDescriptor() as? ValueParameterDescriptor }
.toMutableList()
override fun getOriginal() = this
override fun substitute(substitutor: TypeSubstitutor): ClassConstructorDescriptor {
@@ -78,7 +78,7 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
contextReceiverParameters.forEach {
builder.appendSignature(MangleConstant.CONTEXT_RECEIVER_PREFIX)
mangleContextReceiverParameter(builder, it)
mangleType(builder, it.type, null)
}
extensionReceiverParameter?.let {
@@ -105,10 +105,6 @@ open class DescriptorMangleComputer(builder: StringBuilder, mode: MangleMode) :
}
}
private fun mangleContextReceiverParameter(vpBuilder: StringBuilder, param: ReceiverParameterDescriptor) {
mangleType(vpBuilder, param.type, null)
}
private fun mangleExtensionReceiverParameter(vpBuilder: StringBuilder, param: ReceiverParameterDescriptor) {
mangleType(vpBuilder, param.type, null)
}
@@ -87,6 +87,13 @@ open class IrMangleComputer(
builder.appendSignature(it)
}
valueParameters.take(contextReceiverParametersCount).forEach {
if (!it.isHidden) {
builder.appendSignature(MangleConstant.CONTEXT_RECEIVER_PREFIX)
mangleType(builder, it.type, null)
}
}
extensionReceiverParameter?.let {
if (!it.isHidden) {
builder.appendSignature(MangleConstant.EXTENSION_RECEIVER_PREFIX)
@@ -94,7 +101,7 @@ open class IrMangleComputer(
}
}
valueParameters.collectForMangler(builder, MangleConstant.VALUE_PARAMETERS) {
valueParameters.drop(contextReceiverParametersCount).collectForMangler(builder, MangleConstant.VALUE_PARAMETERS) {
if (!it.isHidden) {
appendSignature(specialValueParamPrefix(it))
mangleValueParameter(this, it, null)