diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt index b9838c6a8f7..f4b4323f5f7 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.transformStatement import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -83,7 +84,7 @@ class InlineClassLowering(val context: CommonBackendContext) { } (irConstructor.body as IrBlockBody).statements.forEach { statement -> - +statement.transform(object : IrElementTransformerVoid() { + +statement.transformStatement(object : IrElementTransformerVoid() { override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression { expression.transformChildrenVoid() return irBlock(expression) { @@ -124,7 +125,7 @@ class InlineClassLowering(val context: CommonBackendContext) { return expression } - }, null) + }) } +irReturn(irGet(thisVar)) }.statements diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt index 361ff78f045..3956d36d135 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt @@ -12,10 +12,7 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI -import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildField @@ -267,9 +264,9 @@ class LocalDeclarationsLowering( private inner class FunctionBodiesRewriter(val localContext: LocalContext?) : IrElementTransformerVoid() { - override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty) = + override fun visitLocalDelegatedProperty(declaration: IrLocalDelegatedProperty): IrStatement = // Both accessors extracted as closures. - declaration.delegate.transform(this, null) + declaration.delegate.transformStatement(this) override fun visitClass(declaration: IrClass) = if (declaration in localClasses) { localClasses[declaration]!!.declaration diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt index bd9786dbb15..6cafb822b3f 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.expressions.impl.IrDoWhileLoopImpl import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol +import org.jetbrains.kotlin.ir.transformStatement /** * Replaces returnable blocks and `return`'s with loops and `break`'s correspondingly. @@ -118,7 +119,7 @@ class ReturnableBlockTransformer(val context: CommonBackendContext, val containe builder.irSetVar(variable.symbol, s.value) } } else { - s.transform(this, null) + s.transformStatement(this) } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt index 6e57c95f00a..12d8fe65307 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/TailrecLowering.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol +import org.jetbrains.kotlin.ir.transformStatement import org.jetbrains.kotlin.ir.util.explicitParameters import org.jetbrains.kotlin.ir.util.getArgumentsWithIr import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid @@ -100,7 +101,7 @@ private fun lowerTailRecursionCalls(context: BackendContext, irFunction: IrFunct ) oldBodyStatements.forEach { - +it.transform(transformer, null) + +it.transformStatement(transformer) } +irBreak(loop) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt index 564bbc6e64e..d6b862fa88a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* +import org.jetbrains.kotlin.ir.transformStatement import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.kotlin.ir.util.patchDeclarationParents @@ -123,7 +124,7 @@ class BlockDecomposerTransformer( val transformedStatements = mutableListOf() statements.forEach { val transformer = if (it === statements.last()) expressionTransformer else statementTransformer - val s = it.transform(transformer, null) + val s = it.transformStatement(transformer) if (s is IrComposite) { transformedStatements.addAll(s.statements) } else { @@ -139,14 +140,14 @@ class BlockDecomposerTransformer( override fun visitFunction(declaration: IrFunction): IrStatement { function = declaration tmpVarCounter = 0 - return declaration.transform(statementTransformer, null) + return declaration.transformStatement(statementTransformer) } override fun visitElement(element: IrElement) = element.transform(statementTransformer, null) private fun processStatements(statements: MutableList) { statements.transformFlat { - destructureComposite(it.transform(statementTransformer, null)) + destructureComposite(it.transformStatement(statementTransformer)) } } @@ -157,7 +158,7 @@ class BlockDecomposerTransformer( private fun IrStatement.asExpression(last: IrExpression): IrExpression { val composite = JsIrBuilder.buildComposite(last.type) - composite.statements += transform(statementTransformer, null) + composite.statements += transformStatement(statementTransformer) composite.statements += last return composite } @@ -658,10 +659,10 @@ class BlockDecomposerTransformer( val newStatements = mutableListOf() for (i in 0 until expression.statements.lastIndex) { - newStatements += destructureComposite(expression.statements[i].transform(statementTransformer, null)) + newStatements += destructureComposite(expression.statements[i].transformStatement(statementTransformer)) } - newStatements += destructureComposite(expression.statements.last().transform(expressionTransformer, null)) + newStatements += destructureComposite(expression.statements.last().transformStatement(expressionTransformer)) return JsIrBuilder.buildComposite(expression.type, newStatements) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt index 71c5360531c..65f3cd10d56 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLowering.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetVariableImpl import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol +import org.jetbrains.kotlin.ir.transformStatement import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.types.isNullable @@ -202,7 +203,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F constructor.body?.statements?.forEach { statement -> +statement - .transform(object : IrElementTransformerVoid() { + .transformStatement(object : IrElementTransformerVoid() { // Don't recurse under nested class declarations override fun visitClass(declaration: IrClass): IrStatement { return declaration @@ -239,8 +240,8 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F +irGet(thisVar) }) } - }, null) - .transform(this@JvmInlineClassLowering, null) + }) + .transformStatement(this@JvmInlineClassLowering) .patchDeclarationParents(replacement) } @@ -427,7 +428,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F if (statement is IrFunction) transformFunctionFlat(statement) else - listOf(statement.transform(this, null)) + listOf(statement.transformStatement(this)) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrElement.kt index efee0c89744..136f29f1c44 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrElement.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrElement.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.ir import org.jetbrains.kotlin.ir.visitors.IrElementTransformer +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitor interface IrElement { @@ -33,10 +34,10 @@ interface IrElement { fun transformChildren(transformer: IrElementTransformer, data: D): Unit } -interface IrStatement : IrElement { - override fun transform(transformer: IrElementTransformer, data: D): IrStatement = - super.transform(transformer, data) as IrStatement -} +interface IrStatement : IrElement + +fun IrStatement.transformStatement(transformer: IrElementTransformerVoid): IrStatement = + transform(transformer, null) as IrStatement inline fun IrElement.assertCast(): T = if (this is T) this else throw AssertionError("Expected ${T::class.simpleName}: $this") diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt index e161cf36d10..063f48db4c1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.IrElementBase import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.symbols.IrSymbol -import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.name.Name interface IrSymbolOwner : IrElement { @@ -46,10 +45,7 @@ interface IrDeclaration : IrStatement, IrMutableAnnotationContainer { val factory: IrFactory } -abstract class IrDeclarationBase : IrElementBase(), IrDeclaration { - override fun transform(transformer: IrElementTransformer, data: D): IrStatement = - accept(transformer, data) as IrStatement -} +abstract class IrDeclarationBase : IrElementBase(), IrDeclaration interface IrSymbolDeclaration : IrDeclaration, IrSymbolOwner { override val symbol: S diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBody.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBody.kt index 551b58773cd..8e47f184810 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBody.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBody.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.ir.expressions import org.jetbrains.kotlin.ir.IrElementBase +import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.IrFactory import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor @@ -58,7 +59,7 @@ abstract class IrBlockBody : IrBody(), IrStatementContainer { override fun transformChildren(transformer: IrElementTransformer, data: D) { statements.forEachIndexed { i, irStatement -> - statements[i] = irStatement.transform(transformer, data) + statements[i] = irStatement.transform(transformer, data) as IrStatement } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt index 72e7be5a000..b1a4868299c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt @@ -97,7 +97,7 @@ class IrReturnableBlockImpl( override fun transformChildren(transformer: IrElementTransformer, data: D) { statements.forEachIndexed { i, irStatement -> - statements[i] = irStatement.transform(transformer, data) + statements[i] = irStatement.transform(transformer, data) as IrStatement } } }