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.*
|
||||||
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user