diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrElementTransformerVoidWithContext.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrElementTransformerVoidWithContext.kt new file mode 100644 index 00000000000..687693e6ad3 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/common/IrElementTransformerVoidWithContext.kt @@ -0,0 +1,44 @@ +package org.jetbrains.kotlin.backend.common + +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.ir.IrStatement +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid + +abstract class IrElementTransformerVoidWithContext(): IrElementTransformerVoid() { + private fun MutableList.push(element: E) = this.add(element) + + private fun MutableList.pop() = this.removeAt(size - 1) + + private fun MutableList.peek(): E? = if (size == 0) null else this[size - 1] + + private val functionsStack = mutableListOf() + private val classesStack = mutableListOf() + + override final fun visitFunction(declaration: IrFunction): IrStatement { + functionsStack.push(declaration.descriptor) + val result = visitFunctionNew(declaration) + functionsStack.pop() + return result + } + + override final fun visitClass(declaration: IrClass): IrStatement { + classesStack.push(declaration.descriptor) + val result = visitClassNew(declaration) + classesStack.pop() + return result + } + + protected val currentFunction get() = functionsStack.peek() + protected val currentClass get() = classesStack.peek() + + open fun visitFunctionNew(declaration: IrFunction) : IrStatement { + return super.visitFunction(declaration) + } + + open fun visitClassNew(declaration: IrClass) : IrStatement { + return super.visitClass(declaration) + } +} \ No newline at end of file diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InnerClassLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InnerClassLowering.kt index 7f5bc8e10f5..1818741b12b 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InnerClassLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InnerClassLowering.kt @@ -1,14 +1,13 @@ package org.jetbrains.kotlin.backend.konan.lower import org.jetbrains.kotlin.backend.common.ClassLoweringPass +import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.lower.callsSuper import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl -import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl import org.jetbrains.kotlin.ir.expressions.IrBlockBody import org.jetbrains.kotlin.ir.expressions.IrExpression @@ -17,7 +16,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl import org.jetbrains.kotlin.ir.util.transformFlat -import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver @@ -84,22 +82,7 @@ internal class InnerClassLowering(val context: Context) : ClassLoweringPass { } private fun lowerOuterThisReferences() { - irClass.transformChildrenVoid(object : IrElementTransformerVoid() { - private fun MutableList.push(element: E) = this.add(element) - - private fun MutableList.pop() = this.removeAt(size - 1) - - private fun MutableList.peek(): E? = if (size == 0) null else this[size - 1] - - private val functionsStack = mutableListOf() - - override fun visitFunction(declaration: IrFunction): IrStatement { - functionsStack.push(declaration.descriptor) - val result = super.visitFunction(declaration) - functionsStack.pop() - return result - } - + irClass.transformChildrenVoid(object : IrElementTransformerVoidWithContext() { override fun visitGetValue(expression: IrGetValue): IrExpression { expression.transformChildrenVoid(this) @@ -108,7 +91,7 @@ internal class InnerClassLowering(val context: Context) : ClassLoweringPass { if (implicitThisClass == classDescriptor) return expression - val constructorDescriptor = functionsStack.peek()!! as? ConstructorDescriptor + val constructorDescriptor = currentFunction!! as? ConstructorDescriptor val startOffset = expression.startOffset val endOffset = expression.endOffset