[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.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 {