From ae54815132542531f4d2c9ef31ec26f355aa8b28 Mon Sep 17 00:00:00 2001 From: "simon.ogorodnik" Date: Wed, 18 Mar 2020 17:58:46 +0300 Subject: [PATCH] [FIR] Fix varargs of unsigned numbers --- .../kotlin/fir/symbols/StandardClassIds.kt | 35 +++++++++++-------- .../jetbrains/kotlin/fir/types/ArrayUtils.kt | 6 ++-- .../signedToUnsignedConversions_test.fir.txt | 4 +-- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt index 4b756f73df6..1391611dcae 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt @@ -14,8 +14,9 @@ object StandardClassIds { private val BASE_KOTLIN_PACKAGE = FqName("kotlin") private val BASE_REFLECT_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("reflect")) private fun String.baseId() = ClassId(BASE_KOTLIN_PACKAGE, Name.identifier(this)) + private fun ClassId.unsignedId() = ClassId(BASE_KOTLIN_PACKAGE, Name.identifier("U" + shortClassName.identifier)) private fun String.reflectId() = ClassId(BASE_REFLECT_PACKAGE, Name.identifier(this)) - private fun Name.arrayId() = ClassId(Array.packageFqName, Name.identifier(identifier + Array.shortClassName.identifier)) + private fun Name.primitiveArrayId() = ClassId(Array.packageFqName, Name.identifier(identifier + Array.shortClassName.identifier)) val Nothing = "Nothing".baseId() val Unit = "Unit".baseId() @@ -33,6 +34,11 @@ object StandardClassIds { val Float = "Float".baseId() val Double = "Double".baseId() + val UByte = Byte.unsignedId() + val UShort = Short.unsignedId() + val UInt = Int.unsignedId() + val ULong = Long.unsignedId() + val String = "String".baseId() val KProperty = "KProperty".reflectId() @@ -45,20 +51,19 @@ object StandardClassIds { fun byName(name: String) = name.baseId() fun reflectByName(name: String) = name.reflectId() - val primitiveArrayTypeByElementType: Map = mutableMapOf().apply { - fun addPrimitive(id: ClassId) { - put(id, id.shortClassName.arrayId()) - } - addPrimitive(Boolean) - addPrimitive(Char) - addPrimitive(Byte) - addPrimitive(Short) - addPrimitive(Int) - addPrimitive(Long) - addPrimitive(Float) - addPrimitive(Double) - } + val primitiveTypes = listOf( + Boolean, Char, + Byte, Short, Int, Long, + Float, Double + ) - val elementTypeByPrimitiveArrayType = primitiveArrayTypeByElementType.map { (k, v) -> v to k }.toMap() + val primitiveArrayTypeByElementType = primitiveTypes.associate { id -> id to id.shortClassName.primitiveArrayId() } + val elementTypeByPrimitiveArrayType = primitiveArrayTypeByElementType.inverseMap() + + val unsignedTypes = listOf(UByte, UShort, UInt, ULong) + val unsignedArrayTypeByElementType = unsignedTypes.associate { id -> id to id.shortClassName.primitiveArrayId() } + val elementTypeByUnsignedArrayType = unsignedArrayTypeByElementType.inverseMap() } + +private fun Map.inverseMap() = entries.associate { (k, v) -> v to k } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ArrayUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ArrayUtils.kt index 0332b4556d6..5ad611a22a9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ArrayUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ArrayUtils.kt @@ -19,7 +19,9 @@ fun ConeTypeProjection.createArrayOf(session: FirSession, nullable: Boolean = fa if (this is ConeKotlinTypeProjection) { val type = type.lowerBoundIfFlexible() if (type is ConeClassLikeType) { - val primitiveArrayId = StandardClassIds.primitiveArrayTypeByElementType[type.lookupTag.classId] + val classId = type.lookupTag.classId + val primitiveArrayId = + StandardClassIds.primitiveArrayTypeByElementType[classId] ?: StandardClassIds.unsignedArrayTypeByElementType[classId] if (primitiveArrayId != null) { return primitiveArrayId.invoke(symbolProvider).constructType(emptyArray(), nullable) } @@ -36,7 +38,7 @@ fun ConeKotlinType.arrayElementType(session: FirSession): ConeKotlinType? { val classId = type.lookupTag.classId if (classId == StandardClassIds.Array) return (type.typeArguments.first() as ConeKotlinTypeProjection).type - val elementType = StandardClassIds.elementTypeByPrimitiveArrayType[classId] + val elementType = StandardClassIds.elementTypeByPrimitiveArrayType[classId] ?: StandardClassIds.elementTypeByUnsignedArrayType[classId] if (elementType != null) { return elementType.invoke(session.firSymbolProvider).constructType(emptyArray(), isNullable = false) } diff --git a/compiler/testData/ir/irText/expressions/signedToUnsignedConversions_test.fir.txt b/compiler/testData/ir/irText/expressions/signedToUnsignedConversions_test.fir.txt index 0013a5521f8..c53906096fa 100644 --- a/compiler/testData/ir/irText/expressions/signedToUnsignedConversions_test.fir.txt +++ b/compiler/testData/ir/irText/expressions/signedToUnsignedConversions_test.fir.txt @@ -77,8 +77,8 @@ FILE fqName: fileName:/signedToUnsignedConversions_test.kt FUN name:takeULong visibility:public modality:FINAL <> (u:kotlin.ULong) returnType:kotlin.Unit VALUE_PARAMETER name:u index:0 type:kotlin.ULong BLOCK_BODY - FUN name:takeUBytes visibility:public modality:FINAL <> (u:kotlin.Array) returnType:kotlin.Unit - VALUE_PARAMETER name:u index:0 type:kotlin.Array varargElementType:kotlin.UByte [vararg] + FUN name:takeUBytes visibility:public modality:FINAL <> (u:kotlin.UByteArray) returnType:kotlin.Unit + VALUE_PARAMETER name:u index:0 type:kotlin.UByteArray varargElementType:kotlin.UByte [vararg] BLOCK_BODY FUN name:takeLong visibility:public modality:FINAL <> (l:kotlin.Long) returnType:kotlin.Unit VALUE_PARAMETER name:l index:0 type:kotlin.Long