[IR] SAM lowering: place wrappers into file if no enclosing class exists
This commit is contained in:
+10
-11
@@ -17,10 +17,7 @@ import org.jetbrains.kotlin.descriptors.Visibility
|
|||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.*
|
import org.jetbrains.kotlin.ir.builders.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
|
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
|
||||||
@@ -60,7 +57,7 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) :
|
|||||||
// the superType.
|
// the superType.
|
||||||
private val cachedImplementations = mutableMapOf<IrType, IrClass>()
|
private val cachedImplementations = mutableMapOf<IrType, IrClass>()
|
||||||
private val inlineCachedImplementations = mutableMapOf<IrType, IrClass>()
|
private val inlineCachedImplementations = mutableMapOf<IrType, IrClass>()
|
||||||
private var enclosingClass: IrClass? = null
|
private var enclosingContainer: IrDeclarationContainer? = null
|
||||||
|
|
||||||
open val privateGeneratedWrapperVisibility: Visibility
|
open val privateGeneratedWrapperVisibility: Visibility
|
||||||
get() = Visibilities.PRIVATE
|
get() = Visibilities.PRIVATE
|
||||||
@@ -68,20 +65,22 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) :
|
|||||||
abstract fun getSuperTypeForWrapper(typeOperand: IrType): IrType
|
abstract fun getSuperTypeForWrapper(typeOperand: IrType): IrType
|
||||||
|
|
||||||
override fun lower(irFile: IrFile) {
|
override fun lower(irFile: IrFile) {
|
||||||
enclosingClass = irFile.declarations.filterIsInstance<IrClass>().find { it.origin == IrDeclarationOrigin.FILE_CLASS }
|
enclosingContainer = irFile.declarations.filterIsInstance<IrClass>().find { it.origin == IrDeclarationOrigin.FILE_CLASS }
|
||||||
|
?: irFile
|
||||||
irFile.transformChildrenVoid()
|
irFile.transformChildrenVoid()
|
||||||
|
|
||||||
for (wrapper in cachedImplementations.values + inlineCachedImplementations.values) {
|
for (wrapper in cachedImplementations.values + inlineCachedImplementations.values) {
|
||||||
val parentClass = wrapper.parent as IrClass
|
val parentClass = wrapper.parent as IrDeclarationContainer
|
||||||
parentClass.declarations += wrapper
|
parentClass.declarations += wrapper
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitClassNew(declaration: IrClass): IrStatement {
|
override fun visitClassNew(declaration: IrClass): IrStatement {
|
||||||
enclosingClass = enclosingClass ?: declaration
|
val prevContainer = enclosingContainer
|
||||||
|
if (prevContainer == null || prevContainer is IrFile)
|
||||||
|
enclosingContainer = declaration
|
||||||
super.visitClassNew(declaration)
|
super.visitClassNew(declaration)
|
||||||
if (enclosingClass == declaration)
|
enclosingContainer = prevContainer
|
||||||
enclosingClass = null
|
|
||||||
return declaration
|
return declaration
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +155,7 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) :
|
|||||||
}.apply {
|
}.apply {
|
||||||
createImplicitParameterDeclarationWithWrappedDescriptor()
|
createImplicitParameterDeclarationWithWrappedDescriptor()
|
||||||
superTypes += superType
|
superTypes += superType
|
||||||
parent = enclosingClass!!
|
parent = enclosingContainer!!
|
||||||
}
|
}
|
||||||
|
|
||||||
val field = subclass.addField {
|
val field = subclass.addField {
|
||||||
|
|||||||
Reference in New Issue
Block a user