[K/N][CExport] Extract type translation to a separate class
This commit is contained in:
committed by
Space Team
parent
f467afa94b
commit
f66d42c644
+100
@@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.backend.konan.cexport
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.konan.*
|
||||||
|
import org.jetbrains.kotlin.builtins.UnsignedType
|
||||||
|
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||||
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isNothing
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
||||||
|
|
||||||
|
internal class CAdapterTypeTranslator(
|
||||||
|
val prefix: String,
|
||||||
|
val builtIns: KonanBuiltIns,
|
||||||
|
) {
|
||||||
|
private fun translateTypeFull(type: KotlinType): Pair<String, String> =
|
||||||
|
if (isMappedToVoid(type)) {
|
||||||
|
"void" to "void"
|
||||||
|
} else {
|
||||||
|
translateNonVoidTypeFull(type)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun isMappedToReference(type: KotlinType) =
|
||||||
|
!isMappedToVoid(type) && !isMappedToString(type) &&
|
||||||
|
type.binaryTypeIsReference()
|
||||||
|
|
||||||
|
fun isMappedToString(binaryType: BinaryType<ClassDescriptor>): Boolean =
|
||||||
|
when (binaryType) {
|
||||||
|
is BinaryType.Primitive -> false
|
||||||
|
is BinaryType.Reference -> binaryType.types.first() == builtIns.string
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isMappedToString(type: KotlinType): Boolean =
|
||||||
|
isMappedToString(type.computeBinaryType())
|
||||||
|
|
||||||
|
internal fun isMappedToVoid(type: KotlinType): Boolean {
|
||||||
|
return type.isUnit() || type.isNothing()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun translateType(element: SignatureElement): String =
|
||||||
|
translateTypeFull(element.type).first
|
||||||
|
|
||||||
|
fun translateType(type: KotlinType): String
|
||||||
|
= translateTypeFull(type).first
|
||||||
|
|
||||||
|
fun translateTypeBridge(type: KotlinType): String = translateTypeFull(type).second
|
||||||
|
|
||||||
|
fun translateTypeFqName(name: String): String {
|
||||||
|
return name.replace('.', '_')
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun translateNonVoidTypeFull(type: KotlinType): Pair<String, String> = type.unwrapToPrimitiveOrReference(
|
||||||
|
eachInlinedClass = { inlinedClass, _ ->
|
||||||
|
unsignedTypeMapping[inlinedClass.classId]?.let {
|
||||||
|
return it to it
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ifPrimitive = { primitiveType, _ ->
|
||||||
|
primitiveTypeMapping[primitiveType]!!.let { it to it }
|
||||||
|
},
|
||||||
|
ifReference = {
|
||||||
|
val clazz = (it.computeBinaryType() as BinaryType.Reference).types.first()
|
||||||
|
if (clazz == builtIns.string) {
|
||||||
|
"const char*" to "KObjHeader*"
|
||||||
|
} else {
|
||||||
|
"${prefix}_kref_${translateTypeFqName(clazz.fqNameSafe.asString())}" to "KObjHeader*"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
private val primitiveTypeMapping = KonanPrimitiveType.values().associate {
|
||||||
|
it to when (it) {
|
||||||
|
KonanPrimitiveType.BOOLEAN -> "${prefix}_KBoolean"
|
||||||
|
KonanPrimitiveType.CHAR -> "${prefix}_KChar"
|
||||||
|
KonanPrimitiveType.BYTE -> "${prefix}_KByte"
|
||||||
|
KonanPrimitiveType.SHORT -> "${prefix}_KShort"
|
||||||
|
KonanPrimitiveType.INT -> "${prefix}_KInt"
|
||||||
|
KonanPrimitiveType.LONG -> "${prefix}_KLong"
|
||||||
|
KonanPrimitiveType.FLOAT -> "${prefix}_KFloat"
|
||||||
|
KonanPrimitiveType.DOUBLE -> "${prefix}_KDouble"
|
||||||
|
KonanPrimitiveType.NON_NULL_NATIVE_PTR -> "void*"
|
||||||
|
KonanPrimitiveType.VECTOR128 -> "${prefix}_KVector128"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val unsignedTypeMapping = UnsignedType.values().associate {
|
||||||
|
it.classId to when (it) {
|
||||||
|
UnsignedType.UBYTE -> "${prefix}_KUByte"
|
||||||
|
UnsignedType.USHORT -> "${prefix}_KUShort"
|
||||||
|
UnsignedType.UINT -> "${prefix}_KUInt"
|
||||||
|
UnsignedType.ULONG -> "${prefix}_KULong"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user