From d228de90081a4a4a40992375e9eb842544b268b1 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Thu, 19 Dec 2019 18:42:01 +0300 Subject: [PATCH] Make ArrayConstructorLowering a BodyLoweringPass --- .../common/lower/ArrayConstructorLowering.kt | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt index 2aef8fd25d7..4efc6d31551 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ArrayConstructorLowering.kt @@ -5,31 +5,38 @@ package org.jetbrains.kotlin.backend.common.lower +import org.jetbrains.kotlin.backend.common.BodyLoweringPass import org.jetbrains.kotlin.backend.common.CommonBackendContext -import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.ir.asSimpleLambda import org.jetbrains.kotlin.backend.common.ir.inline import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.IrConstructor -import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction +import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner +import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.copyTypeArgumentsFrom import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.getClass -import org.jetbrains.kotlin.ir.util.constructedClass -import org.jetbrains.kotlin.ir.util.constructors -import org.jetbrains.kotlin.ir.util.functions +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.util.OperatorNameConventions -class ArrayConstructorLowering(val context: CommonBackendContext) : IrElementTransformerVoidWithContext(), FileLoweringPass { - override fun lower(irFile: IrFile) { - irFile.transformChildrenVoid(this) +class ArrayConstructorLowering(val context: CommonBackendContext) : IrElementTransformerVoidWithContext(), BodyLoweringPass { + + override fun lower(irBody: IrBody, container: IrDeclaration) { + irBody.transformChildrenVoid(ArrayConstructorTransformer(context, container as IrSymbolOwner)) } +} + +private class ArrayConstructorTransformer( + val context: CommonBackendContext, + val container: IrSymbolOwner +) : IrElementTransformerVoidWithContext() { // Array(size, init) -> Array(size) private fun arrayInlineToSizeConstructor(irConstructor: IrConstructor): IrFunctionSymbol? { @@ -64,7 +71,7 @@ class ArrayConstructorLowering(val context: CommonBackendContext) : IrElementTra // (and similar for primitive arrays) val size = expression.getValueArgument(0)!!.transform(this, null) val invokable = expression.getValueArgument(1)!!.transform(this, null) - val scope = currentScope!!.scope + val scope = (currentScope ?: createScope(container)).scope return context.createIrBuilder(scope.scopeOwnerSymbol).irBlock(expression.startOffset, expression.endOffset) { val index = irTemporaryVar(irInt(0)) val sizeVar = irTemporary(size) @@ -83,7 +90,7 @@ class ArrayConstructorLowering(val context: CommonBackendContext) : IrElementTra } body = irBlock { val tempIndex = irTemporary(irGet(index)) - val value = lambda?.inline(parent, listOf(tempIndex)) ?: irCallOp( + val value = lambda?.inline(parent, listOf(tempIndex))?.patchDeclarationParents(scope.getLocalDeclarationParent()) ?: irCallOp( invoke.symbol, invoke.returnType, irGet(invokableVar!!),