[IR] SAM lowering: place wrappers into file if no enclosing class exists

This commit is contained in:
Igor Chevdar
2020-01-31 14:25:38 +03:00
parent 6ecda9e8af
commit 645488b342
@@ -17,10 +17,7 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrClass
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.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrGetValue
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
@@ -60,7 +57,7 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) :
// the superType.
private val cachedImplementations = mutableMapOf<IrType, IrClass>()
private val inlineCachedImplementations = mutableMapOf<IrType, IrClass>()
private var enclosingClass: IrClass? = null
private var enclosingContainer: IrDeclarationContainer? = null
open val privateGeneratedWrapperVisibility: Visibility
get() = Visibilities.PRIVATE
@@ -68,20 +65,22 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) :
abstract fun getSuperTypeForWrapper(typeOperand: IrType): IrType
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()
for (wrapper in cachedImplementations.values + inlineCachedImplementations.values) {
val parentClass = wrapper.parent as IrClass
val parentClass = wrapper.parent as IrDeclarationContainer
parentClass.declarations += wrapper
}
}
override fun visitClassNew(declaration: IrClass): IrStatement {
enclosingClass = enclosingClass ?: declaration
val prevContainer = enclosingContainer
if (prevContainer == null || prevContainer is IrFile)
enclosingContainer = declaration
super.visitClassNew(declaration)
if (enclosingClass == declaration)
enclosingClass = null
enclosingContainer = prevContainer
return declaration
}
@@ -156,7 +155,7 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) :
}.apply {
createImplicitParameterDeclarationWithWrappedDescriptor()
superTypes += superType
parent = enclosingClass!!
parent = enclosingContainer!!
}
val field = subclass.addField {