diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt index fec618093d2..7dfeb4f72bd 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt @@ -579,7 +579,7 @@ internal class IterableLoopHeader( loopVariable: IrVariable?, loopVariableComponents: Map, builder: DeclarationIrBuilder - ) = + ): List = with(builder) { // loopVariable = iteratorVar.next() val iteratorClass = headerInfo.iteratorVariable.type.getClass()!! diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt index ff2028ea3bd..cdcfa1704a2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt @@ -386,7 +386,7 @@ private fun replaceCallToDefaultPrimary(context: JsIrBackendContext, constructor val thisSymbol = (((constructor.body as IrBlockBody).statements .find { it is IrVariable && it.origin === ES6_THIS_VARIABLE_ORIGIN }) as IrVariable?)?.symbol ?: return - (constructor.body as IrBlockBody).statements.transform { + (constructor.body as IrBlockBody).statements.transformInPlace { if (it is IrDelegatingConstructorCall) { val superCtor = it.symbol.owner val initFunc = context.mapping.constructorToInitFunction[superCtor]!! @@ -501,7 +501,7 @@ private class LowerCtorHelper( origin = ES6_THIS_VARIABLE_ORIGIN } - (constructor.body as IrBlockBody).statements.transform { + (constructor.body as IrBlockBody).statements.transformInPlace { if (it === superCall) newThis else it } @@ -561,7 +561,7 @@ private fun changeIrConstructorToIrFunction(context: JsIrBackendContext, contain }, null) } - container.parentAsClass.declarations.transform { + container.parentAsClass.declarations.transformInPlace { if (it === container) newConstructor else it } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AnonymousObjectSuperConstructorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AnonymousObjectSuperConstructorLowering.kt index 9ae4ebbcede..5c298df7a12 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AnonymousObjectSuperConstructorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AnonymousObjectSuperConstructorLowering.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl -import org.jetbrains.kotlin.ir.util.transform +import org.jetbrains.kotlin.ir.util.transformInPlace internal val anonymousObjectSuperConstructorPhase = makeIrFilePhase( ::AnonymousObjectSuperConstructorLowering, @@ -91,7 +91,7 @@ private class AnonymousObjectSuperConstructorLowering(val context: JvmBackendCon } } - objectConstructorBody.statements.transform { + objectConstructorBody.statements.transformInPlace { when { it is IrDelegatingConstructorCall -> it.transform(listOf()) it is IrBlock && it.origin == IrStatementOrigin.ARGUMENTS_REORDERING_FOR_CALL && it.statements.last() is IrDelegatingConstructorCall -> diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt index 728a29acdb7..a184a7e2ede 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt @@ -61,7 +61,7 @@ private class InheritedDefaultMethodsOnClassesLowering(val context: JvmBackendCo } private fun generateInterfaceMethods(irClass: IrClass) { - irClass.declarations.transform { declaration -> + irClass.declarations.transformInPlace { declaration -> (declaration as? IrSimpleFunction)?.findInterfaceImplementation(context.state.jvmDefaultMode)?.let { implementation -> generateDelegationToDefaultImpl(implementation, declaration) } ?: declaration diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt index 0b52383502a..356e8674162 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.util.transform +import org.jetbrains.kotlin.ir.util.transformInPlace import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor @@ -63,7 +63,7 @@ abstract class IrClass : override fun transformChildren(transformer: IrElementTransformer, data: D) { thisReceiver = thisReceiver?.transform(transformer, data) typeParameters = typeParameters.transformIfNeeded(transformer, data) - declarations.transform { it.transform(transformer, data) } + declarations.transformInPlace(transformer, data) } } 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 0667e64bec7..e161cf36d10 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 @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.ir.IrElement +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 @@ -45,7 +46,7 @@ interface IrDeclaration : IrStatement, IrMutableAnnotationContainer { val factory: IrFactory } -abstract class IrDeclarationBase : IrDeclaration { +abstract class IrDeclarationBase : IrElementBase(), IrDeclaration { override fun transform(transformer: IrElementTransformer, data: D): IrStatement = accept(transformer, data) as IrStatement } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt index dbd35327cbb..50a7d8db8a9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrScriptImpl.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol -import org.jetbrains.kotlin.ir.util.transform +import org.jetbrains.kotlin.ir.util.transformInPlace import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name @@ -65,8 +65,8 @@ class IrScriptImpl( } override fun transformChildren(transformer: IrElementTransformer, data: D) { - declarations.transform { it.transform(transformer, data) } - statements.transform { it.transform(transformer, data) } + declarations.transformInPlace(transformer, data) + statements.transformInPlace(transformer, data) thisReceiver = thisReceiver.transform(transformer, data) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt index d2392847bf3..0eba2a78492 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrBlock.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.symbols.IrFileSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol import org.jetbrains.kotlin.ir.util.file -import org.jetbrains.kotlin.ir.util.transform +import org.jetbrains.kotlin.ir.util.transformInPlace import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor @@ -38,7 +38,7 @@ abstract class IrContainerExpression : IrExpression(), IrStatementContainer { } override fun transformChildren(transformer: IrElementTransformer, data: D) { - statements.transform { it.transform(transformer, data) } + statements.transformInPlace(transformer, data) } } @@ -58,5 +58,6 @@ abstract class IrReturnableBlock : IrBlock(), IrSymbolOwner, IrReturnTarget { abstract val inlineFunctionSymbol: IrFunctionSymbol? } +@Suppress("unused") // Used in kotlin-native val IrReturnableBlock.sourceFileSymbol: IrFileSymbol? get() = inlineFunctionSymbol?.owner?.file?.symbol diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt index 8f9aca58b26..77496f9351e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt @@ -17,13 +17,22 @@ package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.IrElementBase import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer -inline fun MutableList.transform(transformation: (T) -> IrElement) { - forEachIndexed { i, item -> - set(i, transformation(item) as T) +inline fun MutableList.transformInPlace(transformation: (T) -> IrElement) { + for (i in 0 until size) { + set(i, transformation(get(i)) as T) + } +} + +fun MutableList.transformInPlace(transformer: IrElementTransformer, data: D) { + for (i in 0 until size) { + // Cast to IrElementBase to avoid casting to interface and invokeinterface, both of which are slow. + @Suppress("UNCHECKED_CAST") + set(i, (get(i) as IrElementBase).transform(transformer, data) as T) } }