diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContext.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContext.kt index 1b3ab0e5037..633580fe3f6 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContext.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContext.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.backend.common.extensions +import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI @@ -34,6 +35,8 @@ interface IrPluginContext : IrGeneratorContext { @ObsoleteDescriptorBasedAPI val typeTranslator: TypeTranslator + val symbols: BuiltinSymbolsBase + val platform: TargetPlatform? /** diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContextImpl.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContextImpl.kt index d7d867cd89c..b9c1b9082f0 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContextImpl.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrPluginContextImpl.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.backend.common.extensions +import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor @@ -34,7 +35,8 @@ open class IrPluginContextImpl constructor( override val typeTranslator: TypeTranslator, override val irBuiltIns: IrBuiltIns, val linker: IrDeserializer, - private val diagnosticReporter: IrMessageLogger + private val diagnosticReporter: IrMessageLogger, + override val symbols: BuiltinSymbolsBase = BuiltinSymbolsBase(irBuiltIns, st) ) : IrPluginContext { override val platform: TargetPlatform? = module.platform diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt index ba535faaf0c..df1f933544f 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt @@ -44,11 +44,7 @@ abstract class Ir(val context: T, val irModule: Ir open fun shouldGenerateHandlerParameterForDefaultBodyFun() = false } -// Some symbols below are used in kotlin-native, so they can't be private -@Suppress("MemberVisibilityCanBePrivate", "PropertyName") -abstract class Symbols( - val context: T, val irBuiltIns: IrBuiltIns, private val symbolTable: ReferenceSymbolTable -) { +open class BuiltinSymbolsBase(val irBuiltIns: IrBuiltIns, private val symbolTable: ReferenceSymbolTable) { private fun getClass(name: Name, vararg packageNameSegments: String = arrayOf("kotlin")): IrClassSymbol = irBuiltIns.findClass(name, *packageNameSegments) @@ -150,11 +146,11 @@ abstract class Symbols( val doubleArrayType get() = doubleArray.owner.defaultType val booleanArrayType get() = booleanArray.owner.defaultType - val primitiveArrays get() = irBuiltIns.primitiveTypesToPrimitiveArrays + val primitiveTypesToPrimitiveArrays get() = irBuiltIns.primitiveTypesToPrimitiveArrays val primitiveArraysToPrimitiveTypes get() = irBuiltIns.primitiveArraysToPrimitiveTypes - val unsignedArrays get() = irBuiltIns.unsignedTypesToUnsignedArrays + val unsignedTypesToUnsignedArrays get() = irBuiltIns.unsignedTypesToUnsignedArrays - val arrays = primitiveArrays.values + unsignedArrays.values + array + val arrays get() = primitiveTypesToPrimitiveArrays.values + unsignedTypesToUnsignedArrays.values + array val collection get() = irBuiltIns.collectionClass val set get() = irBuiltIns.setClass @@ -193,7 +189,14 @@ abstract class Symbols( val extensionToString: IrSimpleFunctionSymbol get() = irBuiltIns.extensionToString val stringPlus: IrSimpleFunctionSymbol get() = irBuiltIns.stringPlus - +} + +// Some symbols below are used in kotlin-native, so they can't be private +@Suppress("MemberVisibilityCanBePrivate", "PropertyName") +abstract class Symbols( + val context: T, irBuiltIns: IrBuiltIns, symbolTable: ReferenceSymbolTable +) : BuiltinSymbolsBase(irBuiltIns, symbolTable) { + abstract val throwNullPointerException: IrSimpleFunctionSymbol abstract val throwTypeCastException: IrSimpleFunctionSymbol diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt index bdbf20a64cd..ff499739a33 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt @@ -128,7 +128,7 @@ class IrIntrinsicMethods(val irBuiltIns: IrBuiltIns, val symbols: JvmSymbols) { ).toMap() private fun intrinsicsThatShouldHaveBeenLowered() = - (symbols.primitiveArrays.map { (_, primitiveClassSymbol) -> + (symbols.primitiveTypesToPrimitiveArrays.map { (_, primitiveClassSymbol) -> val name = primitiveClassSymbol.owner.name.asString() // IntArray -> intArrayOf val arrayOfFunName = name.decapitalizeAsciiOnly() + "Of" diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/Generator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/Generator.kt index 97966d7de62..19189b3b254 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/Generator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/Generator.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.ir.builders.IrGenerator import org.jetbrains.kotlin.ir.builders.IrGeneratorWithScope +import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression @@ -54,7 +55,7 @@ fun Generator.getExpressionTypeWithCoercionToUnit(key: KtExpression): KotlinType if (key.isUsedAsExpression(context.bindingContext)) getTypeInferredByFrontend(key) else - context.irBuiltInsOverDescriptors.unit + (context.irBuiltIns as IrBuiltInsOverDescriptors).unit fun Generator.getExpressionTypeWithCoercionToUnitOrFail(key: KtExpression): KotlinType = getExpressionTypeWithCoercionToUnit(key) ?: throw RuntimeException("No type for expression: ${key.text}") diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt index 575909a36d8..341ee897c71 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorContext.kt @@ -66,8 +66,6 @@ class GeneratorContext private constructor( val samTypeApproximator = SamTypeApproximator(moduleDescriptor.builtIns, languageVersionSettings) - val irBuiltInsOverDescriptors: IrBuiltInsOverDescriptors get() = irBuiltIns as IrBuiltInsOverDescriptors - fun createFileScopeContext(ktFile: KtFile): GeneratorContext { return GeneratorContext( configuration, diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt index 940f5fecf5c..86e124bfa1b 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* +import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol @@ -209,7 +210,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat // Infer type for elvis manually. Take into account possibly nested elvises. val rightType = getResultTypeForElvis(binaryExpression.right!!).unwrap() val leftType = getResultTypeForElvis(binaryExpression.left!!).unwrap() - val leftNNType = intersectTypes(listOf(leftType, context.irBuiltInsOverDescriptors.any)) + val leftNNType = intersectTypes(listOf(leftType, (context.irBuiltIns as IrBuiltInsOverDescriptors).any)) return NewCommonSuperTypeCalculator.commonSuperType(listOf(rightType, leftNNType)) } @@ -436,7 +437,9 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat return memberScope.findSingleFunction(Name.identifier("to$targetTypeName")) } - private val primitiveTypeMapping: Map = context.irBuiltInsOverDescriptors.run { primitiveTypes.zip(primitiveIrTypes).toMap() } + private val primitiveTypeMapping: Map = + (context.irBuiltIns as IrBuiltInsOverDescriptors).run { primitiveTypes.zip(primitiveIrTypes).toMap() } + private fun kotlinTypeToIrType(kotlinType: KotlinType?) = kotlinType?.let { primitiveTypeMapping[it] } private fun generateComparisonOperator(ktExpression: KtBinaryExpression, origin: IrStatementOrigin): IrExpression { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/ArrayAccessAssignmentReceiver.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/ArrayAccessAssignmentReceiver.kt index be1dd352deb..0d3e91e6cfd 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/ArrayAccessAssignmentReceiver.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/ArrayAccessAssignmentReceiver.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.psi2ir.intermediate import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrVariable +import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl @@ -71,7 +72,7 @@ class ArrayAccessAssignmentReceiver( ?: throw AssertionError("Array access should have either indexed-get call or indexed-set call") val hasResult = origin.isAssignmentOperatorWithResult() - val resultType = if (hasResult) kotlinType else callGenerator.context.irBuiltInsOverDescriptors.unit + val resultType = if (hasResult) kotlinType else (callGenerator.context.irBuiltIns as IrBuiltInsOverDescriptors).unit val irResultType = callGenerator.translateType(resultType) if (indexedGetDescriptor?.isDynamic() != false && indexedSetDescriptor?.isDynamic() != false) { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltInsOverDescriptors.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltInsOverDescriptors.kt index 1eae007dd31..161b0046b83 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltInsOverDescriptors.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltInsOverDescriptors.kt @@ -325,7 +325,7 @@ class IrBuiltInsOverDescriptors( ) // TODO switch to IrType - val primitiveTypes = listOf(bool, builtIns.charType, builtIns.byteType, short, int, float, long, double) + val primitiveTypes = listOf(bool, char, byte, short, int, float, long, double) override val primitiveIrTypes = listOf(booleanType, charType, byteType, shortType, intType, floatType, longType, doubleType) override val primitiveIrTypesWithComparisons = listOf(charType, byteType, shortType, intType, floatType, longType, doubleType) override val primitiveFloatingPointIrTypes = listOf(floatType, doubleType) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt index 40d207751ae..07090616be4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/PsiToIr.kt @@ -62,7 +62,7 @@ internal fun Context.psiToIr( moduleDescriptor, symbolTable, generatorContext.irBuiltIns ) - val symbols by lazy { KonanSymbols(this, generatorContext.irBuiltIns, symbolTable, symbolTable.lazyWrapper) } + val symbols = KonanSymbols(this, generatorContext.irBuiltIns, symbolTable, symbolTable.lazyWrapper) val irDeserializer = if (isProducingLibrary && !useLinkerWhenProducingLibrary) { // Enable lazy IR generation for newly-created symbols inside BE diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FunctionsWithoutBoundCheckGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FunctionsWithoutBoundCheckGenerator.kt index df7d3116aeb..4de16aab68c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FunctionsWithoutBoundCheckGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/FunctionsWithoutBoundCheckGenerator.kt @@ -64,7 +64,7 @@ internal class FunctionsWithoutBoundCheckGenerator(val context: KonanBackendCont fun generate() { - val arraysClasses = symbols.primitiveArrays.values + symbols.array + val arraysClasses = symbols.primitiveTypesToPrimitiveArrays.values + symbols.array arraysClasses.forEach { classSymbol -> val setFunction = classSymbol.owner.functions.single { it.name == OperatorNameConventions.SET } classSymbol.owner.addMember(generateFunction(setFunction, KonanNameConventions.setWithoutBoundCheck)) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt index ee68ac6d6c3..fade3af6f40 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt @@ -344,9 +344,6 @@ internal class KonanSymbols( val println = irBuiltIns.findFunctions(Name.identifier("println"), "kotlin", "io") .single { it.descriptor.valueParameters.singleOrNull()?.type == (irBuiltIns as IrBuiltInsOverDescriptors).builtIns.stringType } - val anyNToString = irBuiltIns.findFunctions(Name.identifier("toString")) - .single { it.descriptor.extensionReceiverParameter?.type == (irBuiltIns as IrBuiltInsOverDescriptors).builtIns.nullableAnyType } - override val getContinuation = internalFunction("getContinuation") override val returnIfSuspended = internalFunction("returnIfSuspended") diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt index 3e6d794a730..153a4e68fdf 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt @@ -30,8 +30,8 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { context.irBuiltIns.byteClass, context.irBuiltIns.shortClass, context.irBuiltIns.intClass, context.irBuiltIns.longClass, context.irBuiltIns.floatClass,context.irBuiltIns.doubleClass) + - context.ir.symbols.primitiveArrays.values + - context.ir.symbols.unsignedArrays.values + context.ir.symbols.primitiveTypesToPrimitiveArrays.values + + context.ir.symbols.unsignedTypesToUnsignedArrays.values // TODO: extend logic here by taking into account final acyclic classes. private fun checkAcyclicFieldType(type: IrType): Boolean = acyclicCache.getOrPut(type) { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt index 48d6b115db4..2a84b98692c 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VarargLowering.kt @@ -258,7 +258,7 @@ internal class VarargInjectionLowering constructor(val context: KonanBackendCont private val primitiveArrayHandles = PrimitiveType.values().associate { it to PrimitiveArrayHandle(it) } private val unsignedArrayHandles = UnsignedType.values().mapNotNull { unsignedType -> - symbols.unsignedArrays[unsignedType]?.let { + symbols.unsignedTypesToUnsignedArrays[unsignedType]?.let { val primitiveType = when (unsignedType) { UnsignedType.UBYTE -> PrimitiveType.BYTE UnsignedType.USHORT -> PrimitiveType.SHORT diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index 44f43caa72e..3d2839ab018 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -701,11 +701,6 @@ interface IrBuilderExtension { typeParameters = newTypeParameters } - fun kClassTypeFor(projection: TypeProjection): SimpleType { - val kClass = (compilerContext.irBuiltIns as IrBuiltInsOverDescriptors).builtIns.kClass - return KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, kClass, listOf(projection)) - } - fun createClassReference(classType: KotlinType, startOffset: Int, endOffset: Int): IrClassReference { val clazz = classType.toClassDescriptor!! val classSymbol = compilerContext.referenceClass(clazz.fqNameSafe) ?: error("Couldn't load class $clazz") @@ -1005,10 +1000,13 @@ interface IrBuilderExtension { kType.toClassDescriptor!!, module ) - val projectedOutCurrentKClass = kClassTypeFor(TypeProjectionImpl(Variance.OUT_VARIANCE, kType)) + val projectedOutCurrentKClass = + compilerContext.irBuiltIns.kClassClass.typeWithArguments( + listOf(makeTypeProjection(thisIrType, Variance.OUT_VARIANCE)) + ) add( createArrayOfExpression( - projectedOutCurrentKClass.toIrType(), + projectedOutCurrentKClass, subclasses.map { classReference(it) } ) )