Extract some common code into extractRelatedDeclaration

This commit is contained in:
Ivan Kylchik
2023-02-13 16:29:28 +01:00
committed by Space Team
parent 4fc95624a0
commit 4ab38ffcfc
3 changed files with 12 additions and 21 deletions
@@ -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<IrFunction>()?.firstOrNull()?.takeIf { it.body != null }
container?.let {
LocalDeclarationsLowering(
@@ -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? {
@@ -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
}
}