Extract some common code into extractRelatedDeclaration
This commit is contained in:
+2
-14
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user