IR: slightly simplify deep copy interface
Do not pass TypeRemapper explicitly unless an instance of something other than DeepCopyTypeRemapper is required.
This commit is contained in:
committed by
Space Team
parent
d659b76de5
commit
e7e8cba1b4
+1
-4
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||
import org.jetbrains.kotlin.ir.util.DeepCopyIrTreeWithSymbols
|
||||
import org.jetbrains.kotlin.ir.util.SymbolRemapper
|
||||
import org.jetbrains.kotlin.ir.util.TypeRemapper
|
||||
import org.jetbrains.kotlin.ir.util.render
|
||||
import org.jetbrains.kotlin.utils.memoryOptimizedMap
|
||||
|
||||
@@ -76,9 +75,7 @@ internal class ActualizerSymbolRemapper(private val expectActualMap: Map<IrSymbo
|
||||
private inline fun <reified S : IrSymbol> S.actualizeSymbol(): S = (expectActualMap[this] as? S) ?: this
|
||||
}
|
||||
|
||||
internal open class ActualizerVisitor(private val symbolRemapper: SymbolRemapper, typeRemapper: TypeRemapper) :
|
||||
DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper) {
|
||||
|
||||
internal open class ActualizerVisitor(private val symbolRemapper: SymbolRemapper) : DeepCopyIrTreeWithSymbols(symbolRemapper) {
|
||||
// We shouldn't touch attributes, because Fir2Ir wouldn't set them to anything meaningful anyway.
|
||||
// So it would be better to have them as is, i.e. referring to `this`, not some random node removed from the tree
|
||||
override fun <D : IrAttributeContainer> D.processAttributes(other: IrAttributeContainer?): D = this
|
||||
|
||||
+5
-5
@@ -10,14 +10,15 @@ import org.jetbrains.kotlin.ir.declarations.copyAttributes
|
||||
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.util.SymbolRemapper
|
||||
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||
import org.jetbrains.kotlin.ir.util.remapSymbolParent
|
||||
|
||||
internal class FunctionDefaultParametersActualizer(
|
||||
symbolRemapper: ActualizerSymbolRemapper,
|
||||
typeRemapper: DeepCopyTypeRemapper,
|
||||
private val expectActualMap: Map<IrSymbol, IrSymbol>
|
||||
) {
|
||||
private val visitor = FunctionDefaultParametersActualizerVisitor(symbolRemapper, typeRemapper)
|
||||
private val visitor = FunctionDefaultParametersActualizerVisitor(symbolRemapper)
|
||||
|
||||
fun actualize() {
|
||||
for ((expect, actual) in expectActualMap) {
|
||||
@@ -37,8 +38,7 @@ internal class FunctionDefaultParametersActualizer(
|
||||
}
|
||||
}
|
||||
|
||||
private class FunctionDefaultParametersActualizerVisitor(private val symbolRemapper: SymbolRemapper, typeRemapper: TypeRemapper) :
|
||||
ActualizerVisitor(symbolRemapper, typeRemapper) {
|
||||
private class FunctionDefaultParametersActualizerVisitor(private val symbolRemapper: SymbolRemapper) : ActualizerVisitor(symbolRemapper) {
|
||||
override fun visitGetValue(expression: IrGetValue): IrGetValue {
|
||||
// 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
|
||||
|
||||
+6
-8
@@ -5,16 +5,17 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.common.actualizer
|
||||
|
||||
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
|
||||
import org.jetbrains.kotlin.backend.common.actualizer.checker.IrExpectActualCheckers
|
||||
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
|
||||
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
|
||||
import org.jetbrains.kotlin.ir.types.classOrFail
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.util.SymbolRemapper
|
||||
import org.jetbrains.kotlin.ir.util.classIdOrFail
|
||||
|
||||
data class IrActualizedResult(
|
||||
val actualizedExpectDeclarations: List<IrDeclaration>,
|
||||
@@ -70,9 +71,7 @@ class IrActualizer(
|
||||
return getReferencedClass(symbol)
|
||||
}
|
||||
}
|
||||
val classTypeRemapper = DeepCopyTypeRemapper(classSymbolRemapper)
|
||||
val classActualizerVisitor = ActualizerVisitor(classSymbolRemapper, classTypeRemapper)
|
||||
dependentFragments.forEach { it.transform(classActualizerVisitor, null) }
|
||||
dependentFragments.forEach { it.transform(ActualizerVisitor(classSymbolRemapper), null) }
|
||||
}
|
||||
|
||||
fun actualizeCallablesAndMergeModules(): Map<IrSymbol, IrSymbol> {
|
||||
@@ -95,11 +94,10 @@ class IrActualizer(
|
||||
|
||||
// 4. Copy and actualize function parameter default values from expect functions
|
||||
val symbolRemapper = ActualizerSymbolRemapper(expectActualMap)
|
||||
val typeRemapper = DeepCopyTypeRemapper(symbolRemapper)
|
||||
FunctionDefaultParametersActualizer(symbolRemapper, typeRemapper, expectActualMap).actualize()
|
||||
FunctionDefaultParametersActualizer(symbolRemapper, expectActualMap).actualize()
|
||||
|
||||
// 5. Actualize expect calls in dependent fragments using info obtained in the previous steps
|
||||
val actualizerVisitor = ActualizerVisitor(symbolRemapper, typeRemapper)
|
||||
val actualizerVisitor = ActualizerVisitor(symbolRemapper)
|
||||
dependentFragments.forEach { it.transform(actualizerVisitor, null) }
|
||||
|
||||
// 6. Move all declarations to mainFragment
|
||||
|
||||
+6
-5
@@ -5,8 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.common.actualizer
|
||||
|
||||
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||
@@ -21,7 +21,9 @@ import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
import org.jetbrains.kotlin.resolve.calls.mpp.AbstractExpectActualMatcher
|
||||
import org.jetbrains.kotlin.resolve.multiplatform.*
|
||||
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualAnnotationsIncompatibilityType
|
||||
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCheckingCompatibility
|
||||
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualMatchingCompatibility
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
|
||||
|
||||
@@ -220,9 +222,8 @@ private fun createFakeOverrideFunction(
|
||||
it.annotations = actualFunction.annotations.map { p -> p.deepCopyWithSymbols(it) }
|
||||
it.typeParameters = actualFunction.typeParameters.map { p -> p.deepCopyWithSymbols(it) }
|
||||
|
||||
val typeRemapper = IrTypeParameterRemapper(actualFunction.typeParameters.zip(it.typeParameters).toMap())
|
||||
fun IrValueParameter.deepCopyWithTypeParameters(): IrValueParameter = deepCopyWithSymbols(it) { symbolRemapper, _ ->
|
||||
DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper)
|
||||
fun IrValueParameter.deepCopyWithTypeParameters(): IrValueParameter = deepCopyWithSymbols(it) { _ ->
|
||||
IrTypeParameterRemapper(actualFunction.typeParameters.zip(it.typeParameters).toMap())
|
||||
}
|
||||
|
||||
it.dispatchReceiverParameter = actualFunction.dispatchReceiverParameter?.deepCopyWithTypeParameters()
|
||||
|
||||
Reference in New Issue
Block a user