[IR] Move IrGetValue.actualize() to IrUtils and rename it

^KT-62292
This commit is contained in:
Pavel Kunyavskiy
2023-11-14 13:37:04 +01:00
committed by Space Team
parent e80d4b1d60
commit 763d2ec2fe
5 changed files with 39 additions and 44 deletions
@@ -172,9 +172,9 @@ open class ExpectDeclarationRemover(val symbolTable: ReferenceSymbolTable, priva
.transform(object : IrElementTransformerVoid() { .transform(object : IrElementTransformerVoid() {
override fun visitGetValue(expression: IrGetValue): IrExpression { override fun visitGetValue(expression: IrGetValue): IrExpression {
expression.transformChildrenVoid() expression.transformChildrenVoid()
return expression.actualize( return expression.remapSymbolParent(
classActualizer = { symbolTable.descriptorExtension.referenceClass(it.descriptor.findActualForExpect() as ClassDescriptor).owner }, classRemapper = { symbolTable.descriptorExtension.referenceClass(it.descriptor.findActualForExpect() as ClassDescriptor).owner },
functionActualizer = { symbolTable.referenceFunction(it.descriptor.findActualForExpect() as FunctionDescriptor).owner } functionRemapper = { symbolTable.referenceFunction(it.descriptor.findActualForExpect() as FunctionDescriptor).owner }
) )
} }
}, data = null) }, data = null)
@@ -248,35 +248,4 @@ fun ParameterDescriptor.copyAsValueParameter(newOwner: CallableDescriptor, index
source = source source = source
) )
else -> throw Error("Unexpected parameter descriptor: $this") else -> throw Error("Unexpected parameter descriptor: $this")
}
fun IrGetValue.actualize(classActualizer: (IrClass) -> IrClass, functionActualizer: (IrFunction) -> IrFunction): IrGetValue {
val symbol = symbol
if (symbol !is IrValueParameterSymbol) {
return this
}
val parameter = symbol.owner
val newSymbol = when (val parent = parameter.parent) {
is IrClass -> {
assert(parameter == parent.thisReceiver)
classActualizer(parent).thisReceiver!!
}
is IrFunction -> {
val actualizedFunction = functionActualizer(parent)
when (parameter) {
parent.dispatchReceiverParameter -> actualizedFunction.dispatchReceiverParameter!!
parent.extensionReceiverParameter -> actualizedFunction.extensionReceiverParameter!!
else -> {
assert(parent.valueParameters[parameter.index] == parameter)
actualizedFunction.valueParameters[parameter.index]
}
}
}
else -> error(parent)
}
return IrGetValueImpl(startOffset, endOffset, newSymbol.type, newSymbol.symbol, origin)
} }
@@ -5,16 +5,12 @@
package org.jetbrains.kotlin.backend.common.actualizer package org.jetbrains.kotlin.backend.common.actualizer
import org.jetbrains.kotlin.backend.common.lower.actualize
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.copyAttributes import org.jetbrains.kotlin.ir.declarations.copyAttributes
import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.expressions.IrGetValue
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.DeepCopyTypeRemapper import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.SymbolRemapper
import org.jetbrains.kotlin.ir.util.TypeRemapper
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
internal class FunctionDefaultParametersActualizer( internal class FunctionDefaultParametersActualizer(
symbolRemapper: ActualizerSymbolRemapper, symbolRemapper: ActualizerSymbolRemapper,
@@ -46,9 +42,9 @@ private class FunctionDefaultParametersActualizerVisitor(private val symbolRemap
override fun visitGetValue(expression: IrGetValue): IrGetValue { override fun visitGetValue(expression: IrGetValue): IrGetValue {
// It performs actualization of dispatch/extension receivers // It performs actualization of dispatch/extension receivers
// It's actual only for default parameter values of expect functions because expect functions don't have bodies // It's actual only for default parameter values of expect functions because expect functions don't have bodies
return expression.actualize( return expression.remapSymbolParent(
classActualizer = { symbolRemapper.getReferencedClass(it.symbol).owner }, classRemapper = { symbolRemapper.getReferencedClass(it.symbol).owner },
functionActualizer = { symbolRemapper.getReferencedFunction(it.symbol).owner } functionRemapper = { symbolRemapper.getReferencedFunction(it.symbol).owner }
).copyAttributes(expression) ).copyAttributes(expression)
} }
} }
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.backend.common.actualizer package org.jetbrains.kotlin.backend.common.actualizer
import org.jetbrains.kotlin.backend.common.actualizer.checker.areIrExpressionConstValuesEqual import org.jetbrains.kotlin.backend.common.actualizer.checker.areIrExpressionConstValuesEqual
import org.jetbrains.kotlin.backend.common.sourceElement
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
@@ -540,7 +539,7 @@ internal abstract class IrExpectActualMatchingContext(
override val DeclarationSymbolMarker.hasSourceAnnotationsErased: Boolean override val DeclarationSymbolMarker.hasSourceAnnotationsErased: Boolean
get() { get() {
val ir = asIr() val ir = asIr()
return ir.sourceElement() == null && ir.origin !is IrDeclarationOrigin.GeneratedByPlugin return ir.startOffset < 0 && ir.origin !is IrDeclarationOrigin.GeneratedByPlugin
} }
// IR checker traverses member scope itself and collects mappings // IR checker traverses member scope itself and collects mappings
@@ -788,6 +788,37 @@ fun IrExpression.remapReceiver(oldReceiver: IrValueParameter?, newReceiver: IrVa
else -> shallowCopy() else -> shallowCopy()
} }
fun IrGetValue.remapSymbolParent(classRemapper: (IrClass) -> IrClass, functionRemapper: (IrFunction) -> IrFunction): IrGetValue {
val symbol = symbol
if (symbol !is IrValueParameterSymbol) {
return this
}
val parameter = symbol.owner
val newSymbol = when (val parent = parameter.parent) {
is IrClass -> {
assert(parameter == parent.thisReceiver)
classRemapper(parent).thisReceiver!!
}
is IrFunction -> {
val remappedFunction = functionRemapper(parent)
when (parameter) {
parent.dispatchReceiverParameter -> remappedFunction.dispatchReceiverParameter!!
parent.extensionReceiverParameter -> remappedFunction.extensionReceiverParameter!!
else -> {
assert(parent.valueParameters[parameter.index] == parameter)
remappedFunction.valueParameters[parameter.index]
}
}
}
else -> error(parent)
}
return IrGetValueImpl(startOffset, endOffset, newSymbol.type, newSymbol.symbol, origin)
}
val IrDeclarationParent.isFacadeClass: Boolean val IrDeclarationParent.isFacadeClass: Boolean
get() = this is IrClass && get() = this is IrClass &&
(origin == IrDeclarationOrigin.JVM_MULTIFILE_CLASS || (origin == IrDeclarationOrigin.JVM_MULTIFILE_CLASS ||