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.*
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom import org.jetbrains.kotlin.ir.util.*
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.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.name.NameUtils import org.jetbrains.kotlin.name.NameUtils
@@ -82,15 +79,6 @@ class RemoveDuplicatedInlinedLocalClassesLowering(val context: JvmBackendContext
return result 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) { private fun reuseConstructorFromOriginalClass(block: IrBlock, anonymousClass: IrClass) {
val lastStatement = block.statements.last() val lastStatement = block.statements.last()
val constructorCall = (lastStatement as? IrConstructorCall) 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 // 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. // 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 } ?.filterIsInstance<IrFunction>()?.firstOrNull()?.takeIf { it.body != null }
container?.let { container?.let {
LocalDeclarationsLowering( LocalDeclarationsLowering(
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrBlock 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.expressions.IrFunctionReference
import org.jetbrains.kotlin.ir.types.isNullable import org.jetbrains.kotlin.ir.types.isNullable
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
@@ -93,12 +92,7 @@ fun IrFunction.isReifiable(): Boolean =
private fun IrAttributeContainer.getDeclarationBeforeInline(): IrDeclaration? { private fun IrAttributeContainer.getDeclarationBeforeInline(): IrDeclaration? {
val original = this.originalBeforeInline ?: return null val original = this.originalBeforeInline ?: return null
return when (original) { return original.extractRelatedDeclaration()
is IrClass -> return original
is IrFunctionExpression -> original.function
is IrFunctionReference -> original.symbol.owner
else -> null
}
} }
fun IrAttributeContainer.getAttributeOwnerBeforeInline(): IrAttributeContainer? { fun IrAttributeContainer.getAttributeOwnerBeforeInline(): IrAttributeContainer? {
@@ -1402,3 +1402,12 @@ val Int.previousOffset
-1 -> UNDEFINED_OFFSET -1 -> UNDEFINED_OFFSET
else -> minus(1) else -> minus(1)
} }
fun IrAttributeContainer.extractRelatedDeclaration(): IrDeclaration? {
return when (this) {
is IrClass -> this
is IrFunctionExpression -> function
is IrFunctionReference -> symbol.owner
else -> null
}
}