[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:
committed by
Space Team
parent
5700212119
commit
1a29b9efff
@@ -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 {
|
||||
|
||||
+1
-5
@@ -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)
|
||||
}
|
||||
|
||||
+8
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user