[klib] Fix printing type parameters in methods (#1319)
This commit is contained in:
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.backend.konan.serialization.KonanSerializerProtocol
|
|||||||
import org.jetbrains.kotlin.backend.konan.serialization.parseModuleHeader
|
import org.jetbrains.kotlin.backend.konan.serialization.parseModuleHeader
|
||||||
import org.jetbrains.kotlin.backend.konan.serialization.parsePackageFragment
|
import org.jetbrains.kotlin.backend.konan.serialization.parsePackageFragment
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.serialization.Flags
|
import org.jetbrains.kotlin.serialization.Flags
|
||||||
import org.jetbrains.kotlin.serialization.Flags.*
|
import org.jetbrains.kotlin.serialization.Flags.*
|
||||||
import org.jetbrains.kotlin.serialization.KonanLinkData
|
import org.jetbrains.kotlin.serialization.KonanLinkData
|
||||||
@@ -93,6 +94,9 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment,
|
|||||||
private val ProtoBuf.Class.classId: ClassId
|
private val ProtoBuf.Class.classId: ClassId
|
||||||
get() = nameResolver.getClassId(this.fqName)
|
get() = nameResolver.getClassId(this.fqName)
|
||||||
|
|
||||||
|
private val ProtoBuf.TypeParameter.resolvedName: String
|
||||||
|
get() = nameResolver.getName(name).asString()
|
||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
object Indent {
|
object Indent {
|
||||||
@@ -104,6 +108,7 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment,
|
|||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
// TODO: Replace with one context
|
||||||
object TypeTables {
|
object TypeTables {
|
||||||
val tables = mutableListOf<TypeTable>()
|
val tables = mutableListOf<TypeTable>()
|
||||||
fun push(table: ProtoBuf.TypeTable) { tables.add(TypeTable(table)) }
|
fun push(table: ProtoBuf.TypeTable) { tables.add(TypeTable(table)) }
|
||||||
@@ -112,6 +117,23 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment,
|
|||||||
fun type(typeId: Int) = tables.last().get(typeId)
|
fun type(typeId: Int) = tables.last().get(typeId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object TypeParameterNames {
|
||||||
|
val typeParameters = mutableListOf<Map<Int, ProtoBuf.TypeParameter>>()
|
||||||
|
fun push(list: List<ProtoBuf.TypeParameter>) {
|
||||||
|
typeParameters.add(list.map { it.id to it }.toMap())
|
||||||
|
}
|
||||||
|
fun pop() = typeParameters.removeAt(typeParameters.lastIndex)
|
||||||
|
fun typeParameter(parameterId: Int): ProtoBuf.TypeParameter? {
|
||||||
|
typeParameters.asReversed().forEach {
|
||||||
|
val typeParameter = it[parameterId]
|
||||||
|
if (typeParameter != null) {
|
||||||
|
return typeParameter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
val ProtoBuf.Class.isTopLevel: Boolean
|
val ProtoBuf.Class.isTopLevel: Boolean
|
||||||
@@ -147,6 +169,8 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment,
|
|||||||
|
|
||||||
private fun ProtoBuf.Class.asString(): String {
|
private fun ProtoBuf.Class.asString(): String {
|
||||||
if (hasTypeTable()) TypeTables.push(typeTable)
|
if (hasTypeTable()) TypeTables.push(typeTable)
|
||||||
|
TypeParameterNames.push(typeParameterList)
|
||||||
|
|
||||||
val result = buildString {
|
val result = buildString {
|
||||||
val classId = nameResolver.getClassId(fqName)
|
val classId = nameResolver.getClassId(fqName)
|
||||||
val className = if (!isCompanionObject) classId.shortClassName else ""
|
val className = if (!isCompanionObject) classId.shortClassName else ""
|
||||||
@@ -184,6 +208,8 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment,
|
|||||||
enumToEntries[classId]?.forEach { append(it.asString()) }
|
enumToEntries[classId]?.forEach { append(it.asString()) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TypeParameterNames.pop()
|
||||||
if (hasTypeTable()) TypeTables.pop()
|
if (hasTypeTable()) TypeTables.pop()
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
@@ -226,6 +252,8 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment,
|
|||||||
|
|
||||||
private fun ProtoBuf.Function.asString(isInterface: Boolean = false): String {
|
private fun ProtoBuf.Function.asString(isInterface: Boolean = false): String {
|
||||||
if (hasTypeTable()) TypeTables.push(typeTable)
|
if (hasTypeTable()) TypeTables.push(typeTable)
|
||||||
|
TypeParameterNames.push(typeParameterList)
|
||||||
|
|
||||||
val result = buildString {
|
val result = buildString {
|
||||||
val name = stringTable.getString(name)
|
val name = stringTable.getString(name)
|
||||||
val visibility = Flags.VISIBILITY.get(flags).asString()
|
val visibility = Flags.VISIBILITY.get(flags).asString()
|
||||||
@@ -239,6 +267,8 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment,
|
|||||||
val returnType = returnType()
|
val returnType = returnType()
|
||||||
append("$annotations$Indent$isExternal$modality$visibility${isInline}fun $typeParameters$receiverType$name$valueParameters$returnType\n")
|
append("$annotations$Indent$isExternal$modality$visibility${isInline}fun $typeParameters$receiverType$name$valueParameters$returnType\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TypeParameterNames.pop()
|
||||||
if (hasTypeTable()) TypeTables.pop()
|
if (hasTypeTable()) TypeTables.pop()
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
@@ -370,9 +400,10 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment,
|
|||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
private fun ProtoBuf.Type.name() = when {
|
private fun ProtoBuf.Type.name() = when {
|
||||||
hasClassName() -> getName(className)
|
hasClassName() -> getName(className)
|
||||||
|
hasTypeParameter() -> TypeParameterNames.typeParameter(typeParameter)?.resolvedName ?: "undefined"
|
||||||
hasTypeParameterName() -> stringTable.getString(typeParameterName)
|
hasTypeParameterName() -> stringTable.getString(typeParameterName)
|
||||||
hasTypeAliasName() -> stringTable.getString(typeAliasName)
|
hasTypeAliasName() -> stringTable.getString(typeAliasName)
|
||||||
else -> "undefined"
|
else -> "undefined"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user