From 4ab38ffcfcb1a0024867069135177a823b488703 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 13 Feb 2023 16:29:28 +0100 Subject: [PATCH] Extract some common code into `extractRelatedDeclaration` --- ...emoveDuplicatedInlinedLocalClassesLowering.kt | 16 ++-------------- .../kotlin/backend/jvm/ir/JvmIrInlineUtils.kt | 8 +------- .../src/org/jetbrains/kotlin/ir/util/IrUtils.kt | 9 +++++++++ 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/RemoveDuplicatedInlinedLocalClassesLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/RemoveDuplicatedInlinedLocalClassesLowering.kt index c79a51ac111..6dc005b0038 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/RemoveDuplicatedInlinedLocalClassesLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/RemoveDuplicatedInlinedLocalClassesLowering.kt @@ -19,10 +19,7 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl -import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom -import org.jetbrains.kotlin.ir.util.defaultType -import org.jetbrains.kotlin.ir.util.parentAsClass -import org.jetbrains.kotlin.ir.util.primaryConstructor +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.name.NameUtils @@ -82,15 +79,6 @@ class RemoveDuplicatedInlinedLocalClassesLowering(val context: JvmBackendContext return result } - private fun IrAttributeContainer.getOriginalDeclaration(): IrDeclaration? { - return when (val original = this.attributeOwnerId) { - is IrClass -> return original - is IrFunctionExpression -> original.function - is IrFunctionReference -> original.symbol.owner - else -> null - } - } - private fun reuseConstructorFromOriginalClass(block: IrBlock, anonymousClass: IrClass) { val lastStatement = block.statements.last() val constructorCall = (lastStatement as? IrConstructorCall) @@ -99,7 +87,7 @@ class RemoveDuplicatedInlinedLocalClassesLowering(val context: JvmBackendContext // It is possible that inlined class will be lowered before original. In that case we must launch `LocalDeclarationsLowering` and // lower original declaration to get correct captured constructor. - val container = anonymousClass.getOriginalDeclaration()?.parents + val container = anonymousClass.attributeOwnerId.extractRelatedDeclaration()?.parents ?.filterIsInstance()?.firstOrNull()?.takeIf { it.body != null } container?.let { LocalDeclarationsLowering( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrInlineUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrInlineUtils.kt index 05a240e3334..0613d978e9a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrInlineUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrInlineUtils.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibility import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrBlock -import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionReference import org.jetbrains.kotlin.ir.types.isNullable import org.jetbrains.kotlin.ir.util.* @@ -93,12 +92,7 @@ fun IrFunction.isReifiable(): Boolean = private fun IrAttributeContainer.getDeclarationBeforeInline(): IrDeclaration? { val original = this.originalBeforeInline ?: return null - return when (original) { - is IrClass -> return original - is IrFunctionExpression -> original.function - is IrFunctionReference -> original.symbol.owner - else -> null - } + return original.extractRelatedDeclaration() } fun IrAttributeContainer.getAttributeOwnerBeforeInline(): IrAttributeContainer? { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 35b2ef18b85..29a4e2dc3f0 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -1402,3 +1402,12 @@ val Int.previousOffset -1 -> UNDEFINED_OFFSET else -> minus(1) } + +fun IrAttributeContainer.extractRelatedDeclaration(): IrDeclaration? { + return when (this) { + is IrClass -> this + is IrFunctionExpression -> function + is IrFunctionReference -> symbol.owner + else -> null + } +}