IR: Refactor primitive arrays handling in the new IrBuiltIns
for better compatibility e.g. with native
This commit is contained in:
committed by
TeamCityServer
parent
3b2bb2ba9f
commit
48a3c64901
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.ir
|
||||
|
||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||
import org.jetbrains.kotlin.builtins.UnsignedType
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl
|
||||
@@ -109,11 +110,11 @@ abstract class IrBuiltIns {
|
||||
abstract val booleanArray: IrClassSymbol
|
||||
|
||||
abstract val primitiveArraysToPrimitiveTypes: Map<IrClassSymbol, PrimitiveType>
|
||||
abstract val primitiveArrays: Set<IrClassSymbol>
|
||||
abstract val primitiveTypesToPrimitiveArrays: Map<PrimitiveType, IrClassSymbol>
|
||||
abstract val primitiveArrayElementTypes: Map<IrClassSymbol, IrType?>
|
||||
abstract val primitiveArrayForType: Map<IrType?, IrClassSymbol>
|
||||
|
||||
abstract val unsignedArrays: Set<IrClassSymbol>
|
||||
abstract val unsignedTypesToUnsignedArrays: Map<UnsignedType, IrClassSymbol>
|
||||
|
||||
abstract val lessFunByOperandType: Map<IrClassifierSymbol, IrSimpleFunctionSymbol>
|
||||
abstract val lessOrEqualFunByOperandType: Map<IrClassifierSymbol, IrSimpleFunctionSymbol>
|
||||
@@ -157,8 +158,12 @@ abstract class IrBuiltIns {
|
||||
abstract fun suspendFunctionN(arity: Int): IrClass
|
||||
abstract fun kSuspendFunctionN(arity: Int): IrClass
|
||||
|
||||
// TODO: drop variants from segments, add helper from whole fqn
|
||||
abstract fun findFunctions(name: Name, vararg packageNameSegments: String = arrayOf("kotlin")): Iterable<IrSimpleFunctionSymbol>
|
||||
abstract fun findFunctions(name: Name, packageFqName: FqName): Iterable<IrSimpleFunctionSymbol>
|
||||
abstract fun findClass(name: Name, vararg packageNameSegments: String = arrayOf("kotlin")): IrClassSymbol?
|
||||
abstract fun findClass(name: Name, packageFqName: FqName): IrClassSymbol?
|
||||
abstract fun findBuiltInClassMemberFunctions(builtInClass: IrClassSymbol, name: Name): Iterable<IrSimpleFunctionSymbol>
|
||||
|
||||
abstract fun getBinaryOperator(name: Name, lhsType: IrType, rhsType: IrType): IrSimpleFunctionSymbol
|
||||
abstract fun getUnaryOperator(name: Name, receiverType: IrType): IrSimpleFunctionSymbol
|
||||
|
||||
+25
-5
@@ -325,7 +325,7 @@ class IrBuiltInsOverDescriptors(
|
||||
)
|
||||
|
||||
// TODO switch to IrType
|
||||
val primitiveTypes = listOf(bool, char, byte, short, int, float, long, double)
|
||||
val primitiveTypes = listOf(bool, builtIns.charType, builtIns.byteType, 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)
|
||||
@@ -340,12 +340,15 @@ class IrBuiltInsOverDescriptors(
|
||||
override val booleanArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.BOOLEAN).toIrSymbol()
|
||||
|
||||
override val primitiveArraysToPrimitiveTypes = PrimitiveType.values().associate { builtIns.getPrimitiveArrayClassDescriptor(it).toIrSymbol() to it }
|
||||
override val primitiveArrays = primitiveArraysToPrimitiveTypes.keys
|
||||
override val primitiveTypesToPrimitiveArrays = primitiveArraysToPrimitiveTypes.map { (k, v) -> v to k }.toMap()
|
||||
override val primitiveArrayElementTypes = primitiveArraysToPrimitiveTypes.mapValues { primitiveTypeToIrType[it.value] }
|
||||
override val primitiveArrayForType = primitiveArrayElementTypes.asSequence().associate { it.value to it.key }
|
||||
|
||||
override val unsignedArrays: Set<IrClassSymbol> = UnsignedType.values().mapNotNullTo(mutableSetOf()) { unsignedType ->
|
||||
builtIns.builtInsModule.findClassAcrossModuleDependencies(unsignedType.arrayClassId)?.toIrSymbol()
|
||||
override val unsignedTypesToUnsignedArrays: Map<UnsignedType, IrClassSymbol> by lazy {
|
||||
UnsignedType.values().mapNotNull { unsignedType ->
|
||||
val array = builtIns.builtInsModule.findClassAcrossModuleDependencies(unsignedType.arrayClassId)?.toIrSymbol()
|
||||
if (array == null) null else unsignedType to array
|
||||
}.toMap()
|
||||
}
|
||||
|
||||
override val lessFunByOperandType = primitiveIrTypesWithComparisons.defineComparisonOperatorForEachIrType(BuiltInOperatorNames.LESS)
|
||||
@@ -409,12 +412,28 @@ class IrBuiltInsOverDescriptors(
|
||||
symbolTable.referenceSimpleFunction(it)
|
||||
}
|
||||
|
||||
override fun findFunctions(name: Name, packageFqName: FqName): Iterable<IrSimpleFunctionSymbol> =
|
||||
builtIns.builtInsModule.getPackage(packageFqName).memberScope.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND).map {
|
||||
symbolTable.referenceSimpleFunction(it)
|
||||
}
|
||||
|
||||
override fun findClass(name: Name, vararg packageNameSegments: String): IrClassSymbol? =
|
||||
(builtInsPackage(*packageNameSegments).getContributedClassifier(
|
||||
name,
|
||||
NoLookupLocation.FROM_BACKEND
|
||||
) as? ClassDescriptor)?.let { symbolTable.referenceClass(it) }
|
||||
|
||||
override fun findClass(name: Name, packageFqName: FqName): IrClassSymbol? =
|
||||
(builtIns.builtInsModule.getPackage(packageFqName).memberScope.getContributedClassifier(
|
||||
name,
|
||||
NoLookupLocation.FROM_BACKEND
|
||||
) as? ClassDescriptor)?.let { symbolTable.referenceClass(it) }
|
||||
|
||||
override fun findBuiltInClassMemberFunctions(builtInClass: IrClassSymbol, name: Name): Iterable<IrSimpleFunctionSymbol> =
|
||||
builtInClass.descriptor.unsubstitutedMemberScope
|
||||
.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND)
|
||||
.map { symbolTable.referenceSimpleFunction(it) }
|
||||
|
||||
private val binaryOperatorCache = mutableMapOf<Triple<Name, IrType, IrType>, IrSimpleFunctionSymbol>()
|
||||
|
||||
override fun getBinaryOperator(name: Name, lhsType: IrType, rhsType: IrType): IrSimpleFunctionSymbol {
|
||||
@@ -504,7 +523,7 @@ class IrBuiltInsOverDescriptors(
|
||||
override fun suspendFunctionN(arity: Int): IrClass = functionFactory.suspendFunctionN(arity)
|
||||
override fun kSuspendFunctionN(arity: Int): IrClass = functionFactory.kSuspendFunctionN(arity)
|
||||
|
||||
override val getProgressionLastElementByReturnType: Map<IrClassifierSymbol?, IrSimpleFunctionSymbol> =
|
||||
override val getProgressionLastElementByReturnType: Map<IrClassifierSymbol?, IrSimpleFunctionSymbol> by lazy {
|
||||
builtInsPackage("kotlin", "internal")
|
||||
.getContributedFunctions(Name.identifier("getProgressionLastElement"), NoLookupLocation.FROM_BACKEND)
|
||||
.filter { it.containingDeclaration !is BuiltInsPackageFragment }
|
||||
@@ -514,6 +533,7 @@ class IrBuiltInsOverDescriptors(
|
||||
klass to function
|
||||
}
|
||||
.toMap()
|
||||
}
|
||||
}
|
||||
|
||||
private inline fun MemberScope.findFirstFunction(name: String, predicate: (CallableMemberDescriptor) -> Boolean) =
|
||||
|
||||
@@ -240,7 +240,7 @@ abstract class DataClassMembersGenerator(
|
||||
getIrProperty(property).backingField!!
|
||||
|
||||
val IrClassifierSymbol?.isArrayOrPrimitiveArray: Boolean
|
||||
get() = this == context.irBuiltIns.arrayClass || this in context.irBuiltIns.primitiveArrays
|
||||
get() = this == context.irBuiltIns.arrayClass || this in context.irBuiltIns.primitiveArraysToPrimitiveTypes
|
||||
|
||||
abstract fun declareSimpleFunction(startOffset: Int, endOffset: Int, functionDescriptor: FunctionDescriptor): IrFunction
|
||||
|
||||
|
||||
Reference in New Issue
Block a user