IR: add BackendContext.typeSystem and JvmIrTypeSystemContext

To be able to override JVM-specific behavior of IrTypeSystemContext in
JVM IR, for things like JVM flexible types.
This commit is contained in:
Alexander Udalov
2021-06-30 22:54:37 +02:00
parent ae07127f08
commit 2834c22a85
36 changed files with 140 additions and 91 deletions
@@ -24,6 +24,8 @@ import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
@@ -330,6 +332,9 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
override val irBuiltIns
get() = ir.irModule.irBuiltins
override val typeSystem: IrTypeSystemContext
get() = IrTypeSystemContextImpl(irBuiltIns)
val interopBuiltIns by lazy {
InteropBuiltIns(this.builtIns)
}
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.irBlockBody
import org.jetbrains.kotlin.ir.builders.irCall
@@ -32,9 +31,11 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.typeWith
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.ir.util.module
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.module
internal object DECLARATION_ORIGIN_ENUM : IrDeclarationOriginImpl("ENUM")
@@ -203,7 +204,7 @@ internal class EnumSpecialDeclarationsFactory(val context: Context) {
)
implObject.superTypes += context.irBuiltIns.anyType
implObject.addFakeOverrides(context.irBuiltIns)
implObject.addFakeOverrides(context.typeSystem)
val itemGetterSymbol = findItemGetterSymbol()
val enumEntriesMap = enumEntriesMap(enumClass)
@@ -45,6 +45,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
internal interface KotlinStubs {
val irBuiltIns: IrBuiltIns
val typeSystem: IrTypeSystemContext
val symbols: KonanSymbols
val target: KonanTarget
val language: String
@@ -1221,7 +1222,7 @@ private class ObjCBlockPointerValuePassing(
+irReturn(callBlock(blockPointer, arguments))
}
irClass.addFakeOverrides(stubs.irBuiltIns)
irClass.addFakeOverrides(stubs.typeSystem)
stubs.addKotlin(irClass)
return constructor
@@ -294,7 +294,7 @@ internal class FunctionReferenceLowering(val context: Context): FileLoweringPass
functionReferenceClass.superTypes += superTypes
functionReferenceClass.addFakeOverrides(context.irBuiltIns)
functionReferenceClass.addFakeOverrides(context.typeSystem)
return BuiltFunctionReference(functionReferenceClass, buildConstructor())
}
@@ -80,6 +80,7 @@ private abstract class BaseInteropIrTransformer(private val context: Context) :
return object : KotlinStubs {
override val irBuiltIns get() = context.irBuiltIns
override val symbols get() = context.ir.symbols
override val typeSystem: IrTypeSystemContext get() = context.typeSystem
val klib: KonanLibrary? get() {
return (element as? IrCall)?.symbol?.owner?.konanLibrary as? KonanLibrary
@@ -518,7 +518,7 @@ internal class TestProcessor (val context: Context) {
companionGetter?.let { declarations += it }
superTypes += symbols.baseClassSuite.typeWith(listOf(testClassType, testCompanionType))
addFakeOverrides(context.irBuiltIns)
addFakeOverrides(context.typeSystem)
}
//endregion
@@ -37,6 +37,7 @@ import org.jetbrains.kotlin.ir.descriptors.IrAbstractFunctionFactory
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrPublicSymbolBase
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
@@ -91,7 +92,8 @@ internal class KonanIrLinker(
override fun isBuiltInModule(moduleDescriptor: ModuleDescriptor): Boolean = moduleDescriptor.isNativeStdlib()
private val forwardDeclarationDeserializer = forwardModuleDescriptor?.let { KonanForwardDeclarationModuleDeserializer(it) }
override val fakeOverrideBuilder = FakeOverrideBuilder(this, symbolTable, KonanManglerIr, builtIns, KonanFakeOverrideClassFilter)
override val fakeOverrideBuilder: FakeOverrideBuilder =
FakeOverrideBuilder(this, symbolTable, KonanManglerIr, IrTypeSystemContextImpl(builtIns), KonanFakeOverrideClassFilter)
override fun createModuleDeserializer(moduleDescriptor: ModuleDescriptor, klib: KotlinLibrary?, strategy: DeserializationStrategy): IrModuleDeserializer {
if (moduleDescriptor === forwardModuleDescriptor) {