[minor] IR: minor builtins infrastructure fixes

This commit is contained in:
Ilya Chernikov
2021-07-08 19:18:50 +02:00
committed by TeamCityServer
parent 19f52d9aae
commit 56805dded8
15 changed files with 39 additions and 33 deletions
@@ -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?
/**
@@ -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
@@ -44,11 +44,7 @@ abstract class Ir<out T : CommonBackendContext>(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<out T : CommonBackendContext>(
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<out T : CommonBackendContext>(
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<out T : CommonBackendContext>(
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<out T : CommonBackendContext>(
val context: T, irBuiltIns: IrBuiltIns, symbolTable: ReferenceSymbolTable
) : BuiltinSymbolsBase(irBuiltIns, symbolTable) {
abstract val throwNullPointerException: IrSimpleFunctionSymbol
abstract val throwTypeCastException: IrSimpleFunctionSymbol
@@ -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"
@@ -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}")
@@ -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,
@@ -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<SimpleType, IrType> = context.irBuiltInsOverDescriptors.run { primitiveTypes.zip(primitiveIrTypes).toMap() }
private val primitiveTypeMapping: Map<SimpleType, IrType> =
(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 {
@@ -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) {
@@ -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)