diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt index 44d756d0a15..02939161547 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/lower/LowerUtils.kt @@ -4,13 +4,14 @@ import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrConstructor +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrDelegatingConstructorCall import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.name.Name @@ -54,6 +55,42 @@ inline fun IrGeneratorWithScope.irBlock(expression: IrExpression, origin: IrStat inline fun IrGeneratorWithScope.irBlockBody(irElement: IrElement, body: IrBlockBodyBuilder.() -> Unit) = this.irBlockBody(irElement.startOffset, irElement.endOffset, body) +open class IrBuildingTransformer(private val context: BackendContext) : IrElementTransformerVoid() { + private var currentBuilder: IrBuilderWithScope? = null + + protected val builder: IrBuilderWithScope + get() = currentBuilder!! + + private inline fun withBuilder(declarationDescriptor: DeclarationDescriptor, block: () -> T): T { + val oldBuilder = currentBuilder + currentBuilder = context.createIrBuilder(declarationDescriptor) + return try { + block() + } finally { + currentBuilder = oldBuilder + } + } + + override fun visitFunction(declaration: IrFunction): IrStatement { + withBuilder(declaration.descriptor) { + return super.visitFunction(declaration) + } + } + + override fun visitField(declaration: IrField): IrStatement { + withBuilder(declaration.descriptor) { + // Transforms initializer: + return super.visitField(declaration) + } + } + + override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer): IrStatement { + withBuilder(declaration.descriptor) { + return super.visitAnonymousInitializer(declaration) + } + } +} + fun computeOverrides(current: ClassDescriptor, functionsFromCurrent: List): List { val result = mutableListOf() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLower.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLower.kt index 0b1fab7cd8a..466abe61896 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLower.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLower.kt @@ -62,7 +62,7 @@ internal class KonanLower(val context: Context) { Autoboxing(context).lower(irFile) } phaser.phase(KonanPhase.LOWER_INTEROP) { - InteropLowering(context).runOnFilePostfix(irFile) + InteropLowering(context).lower(irFile) } } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt index 61a0721ad65..979c0e2873b 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt @@ -1,8 +1,8 @@ package org.jetbrains.kotlin.backend.konan.lower -import org.jetbrains.kotlin.backend.common.FunctionLoweringPass +import org.jetbrains.kotlin.backend.common.FileLoweringPass +import org.jetbrains.kotlin.backend.common.lower.IrBuildingTransformer import org.jetbrains.kotlin.backend.common.lower.at -import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.ValueType import org.jetbrains.kotlin.backend.konan.isRepresentedAs @@ -12,12 +12,9 @@ import org.jetbrains.kotlin.ir.builders.IrBuilder import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope import org.jetbrains.kotlin.ir.builders.irCall import org.jetbrains.kotlin.ir.builders.irGet -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.expressions.IrCall -import org.jetbrains.kotlin.ir.expressions.IrExpression -import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall +import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl -import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.OverridingUtil @@ -29,16 +26,15 @@ import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf /** * Lowers some interop intrinsic calls. */ -internal class InteropLowering(val context: Context) : FunctionLoweringPass { - override fun lower(irFunction: IrFunction) { - val transformer = InteropTransformer(context, irFunction.descriptor) - irFunction.transformChildrenVoid(transformer) +internal class InteropLowering(val context: Context) : FileLoweringPass { + override fun lower(irFile: IrFile) { + val transformer = InteropTransformer(context) + irFile.transformChildrenVoid(transformer) } } -private class InteropTransformer(val context: Context, val function: FunctionDescriptor) : IrElementTransformerVoid() { +private class InteropTransformer(val context: Context) : IrBuildingTransformer(context) { - val builder = context.createIrBuilder(function) val interop = context.interopBuiltIns private fun MemberScope.getSingleContributedFunction(name: String,