JVM IR: minor, don't use symbols for maps of multifile members
To simplify usage of these maps at call sites
This commit is contained in:
@@ -88,7 +88,7 @@ class JvmBackendContext(
|
|||||||
|
|
||||||
internal val multifileFacadesToAdd = mutableMapOf<JvmClassName, MutableList<IrClass>>()
|
internal val multifileFacadesToAdd = mutableMapOf<JvmClassName, MutableList<IrClass>>()
|
||||||
internal val multifileFacadeForPart = mutableMapOf<IrClass, JvmClassName>()
|
internal val multifileFacadeForPart = mutableMapOf<IrClass, JvmClassName>()
|
||||||
internal val multifileFacadeMemberToPartMember = mutableMapOf<IrFunctionSymbol, IrFunctionSymbol>()
|
internal val multifileFacadeMemberToPartMember = mutableMapOf<IrFunction, IrFunction>()
|
||||||
|
|
||||||
override var inVerbosePhase: Boolean = false
|
override var inVerbosePhase: Boolean = false
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -112,8 +112,8 @@ class IrSourceCompilerForInline(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (parent.fileParent.fileEntry is MultifileFacadeFileEntry) {
|
if (parent.fileParent.fileEntry is MultifileFacadeFileEntry) {
|
||||||
return (codegen.context.multifileFacadeMemberToPartMember[callee.symbol]
|
return codegen.context.multifileFacadeMemberToPartMember[callee]
|
||||||
?: error("Function from a multi-file facade without the link to the function in the part: ${callee.render()}")).owner
|
?: error("Function from a multi-file facade without the link to the function in the part: ${callee.render()}")
|
||||||
}
|
}
|
||||||
|
|
||||||
return callee
|
return callee
|
||||||
|
|||||||
+13
-19
@@ -35,8 +35,6 @@ import org.jetbrains.kotlin.ir.expressions.IrGetField
|
|||||||
import org.jetbrains.kotlin.ir.expressions.copyTypeArgumentsFrom
|
import org.jetbrains.kotlin.ir.expressions.copyTypeArgumentsFrom
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||||
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
|
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
|
||||||
import org.jetbrains.kotlin.ir.util.transformFlat
|
import org.jetbrains.kotlin.ir.util.transformFlat
|
||||||
@@ -56,8 +54,8 @@ internal val generateMultifileFacadesPhase = namedIrModulePhase(
|
|||||||
context: JvmBackendContext,
|
context: JvmBackendContext,
|
||||||
input: IrModuleFragment
|
input: IrModuleFragment
|
||||||
): IrModuleFragment {
|
): IrModuleFragment {
|
||||||
val movedFields = mutableMapOf<IrFieldSymbol, IrFieldSymbol>()
|
val movedFields = mutableMapOf<IrField, IrField>()
|
||||||
val functionDelegates = mutableMapOf<IrFunctionSymbol, IrFunctionSymbol>()
|
val functionDelegates = mutableMapOf<IrFunction, IrFunction>()
|
||||||
|
|
||||||
input.files.addAll(generateMultifileFacades(input.descriptor, context, movedFields, functionDelegates))
|
input.files.addAll(generateMultifileFacades(input.descriptor, context, movedFields, functionDelegates))
|
||||||
|
|
||||||
@@ -96,8 +94,8 @@ internal class MultifileFacadeFileEntry(
|
|||||||
private fun generateMultifileFacades(
|
private fun generateMultifileFacades(
|
||||||
module: ModuleDescriptor,
|
module: ModuleDescriptor,
|
||||||
context: JvmBackendContext,
|
context: JvmBackendContext,
|
||||||
movedFields: MutableMap<IrFieldSymbol, IrFieldSymbol>,
|
movedFields: MutableMap<IrField, IrField>,
|
||||||
functionDelegates: MutableMap<IrFunctionSymbol, IrFunctionSymbol>
|
functionDelegates: MutableMap<IrFunction, IrFunction>
|
||||||
): List<IrFile> =
|
): List<IrFile> =
|
||||||
context.multifileFacadesToAdd.map { (jvmClassName, partClasses) ->
|
context.multifileFacadesToAdd.map { (jvmClassName, partClasses) ->
|
||||||
val kotlinPackageFqName = partClasses.first().fqNameWhenAvailable!!.parent()
|
val kotlinPackageFqName = partClasses.first().fqNameWhenAvailable!!.parent()
|
||||||
@@ -133,7 +131,7 @@ private fun generateMultifileFacades(
|
|||||||
if (member is IrFunction) {
|
if (member is IrFunction) {
|
||||||
val newMember = member.createMultifileDelegateIfNeeded(context, facadeClass)
|
val newMember = member.createMultifileDelegateIfNeeded(context, facadeClass)
|
||||||
if (newMember != null) {
|
if (newMember != null) {
|
||||||
functionDelegates[member.symbol] = newMember.symbol
|
functionDelegates[member] = newMember
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,18 +140,14 @@ private fun generateMultifileFacades(
|
|||||||
file
|
file
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun moveFieldsOfConstProperties(
|
private fun moveFieldsOfConstProperties(partClass: IrClass, facadeClass: IrClass, movedFields: MutableMap<IrField, IrField>) {
|
||||||
partClass: IrClass,
|
|
||||||
facadeClass: IrClass,
|
|
||||||
movedFields: MutableMap<IrFieldSymbol, IrFieldSymbol>
|
|
||||||
) {
|
|
||||||
partClass.declarations.transformFlat { member ->
|
partClass.declarations.transformFlat { member ->
|
||||||
if (member is IrField && member.shouldMoveToFacade()) {
|
if (member is IrField && member.shouldMoveToFacade()) {
|
||||||
val field = member.deepCopyWithSymbols(facadeClass).also {
|
val field = member.deepCopyWithSymbols(facadeClass).also {
|
||||||
(it as IrFieldImpl).metadata = member.metadata
|
(it as IrFieldImpl).metadata = member.metadata
|
||||||
}
|
}
|
||||||
facadeClass.declarations.add(field)
|
facadeClass.declarations.add(field)
|
||||||
movedFields[member.symbol] = field.symbol
|
movedFields[member] = field
|
||||||
emptyList()
|
emptyList()
|
||||||
} else null
|
} else null
|
||||||
}
|
}
|
||||||
@@ -191,22 +185,22 @@ private fun IrFunction.createMultifileDelegateIfNeeded(context: JvmBackendContex
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class UpdateFieldCallSites(
|
private class UpdateFieldCallSites(
|
||||||
private val movedFields: Map<IrFieldSymbol, IrFieldSymbol>
|
private val movedFields: Map<IrField, IrField>
|
||||||
) : FileLoweringPass, IrElementTransformerVoid() {
|
) : FileLoweringPass, IrElementTransformerVoid() {
|
||||||
override fun lower(irFile: IrFile) {
|
override fun lower(irFile: IrFile) {
|
||||||
irFile.transformChildrenVoid(this)
|
irFile.transformChildrenVoid(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitGetField(expression: IrGetField): IrExpression {
|
override fun visitGetField(expression: IrGetField): IrExpression {
|
||||||
val newField = movedFields[expression.symbol] ?: return super.visitGetField(expression)
|
val newField = movedFields[expression.symbol.owner] ?: return super.visitGetField(expression)
|
||||||
return expression.run {
|
return expression.run {
|
||||||
IrGetFieldImpl(startOffset, endOffset, newField, type, receiver, origin, superQualifierSymbol)
|
IrGetFieldImpl(startOffset, endOffset, newField.symbol, type, receiver, origin, superQualifierSymbol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class UpdateFunctionCallSites(
|
private class UpdateFunctionCallSites(
|
||||||
private val functionDelegates: MutableMap<IrFunctionSymbol, IrFunctionSymbol>
|
private val functionDelegates: MutableMap<IrFunction, IrFunction>
|
||||||
) : FileLoweringPass, IrElementTransformer<IrFunction?> {
|
) : FileLoweringPass, IrElementTransformer<IrFunction?> {
|
||||||
override fun lower(irFile: IrFile) {
|
override fun lower(irFile: IrFile) {
|
||||||
irFile.transformChildren(this, null)
|
irFile.transformChildren(this, null)
|
||||||
@@ -219,12 +213,12 @@ private class UpdateFunctionCallSites(
|
|||||||
if (data?.origin == JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE)
|
if (data?.origin == JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE)
|
||||||
return super.visitCall(expression, data)
|
return super.visitCall(expression, data)
|
||||||
|
|
||||||
val newFunction = functionDelegates[expression.symbol]
|
val newFunction = functionDelegates[expression.symbol.owner]
|
||||||
?: return super.visitCall(expression, data)
|
?: return super.visitCall(expression, data)
|
||||||
|
|
||||||
return expression.run {
|
return expression.run {
|
||||||
// TODO: deduplicate this with ReplaceKFunctionInvokeWithFunctionInvoke
|
// TODO: deduplicate this with ReplaceKFunctionInvokeWithFunctionInvoke
|
||||||
IrCallImpl(startOffset, endOffset, type, newFunction).apply {
|
IrCallImpl(startOffset, endOffset, type, newFunction.symbol).apply {
|
||||||
copyTypeArgumentsFrom(expression)
|
copyTypeArgumentsFrom(expression)
|
||||||
extensionReceiver = expression.extensionReceiver?.transform(this@UpdateFunctionCallSites, null)
|
extensionReceiver = expression.extensionReceiver?.transform(this@UpdateFunctionCallSites, null)
|
||||||
for (i in 0 until valueArgumentsCount) {
|
for (i in 0 until valueArgumentsCount) {
|
||||||
|
|||||||
Reference in New Issue
Block a user