[klib] Fix printing type parameters in methods (#1319)

This commit is contained in:
ilmat192
2018-02-13 13:26:49 +07:00
committed by Nikolay Igotti
parent 959f9eaebc
commit 5e11c61ffb
@@ -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"
} }