From 5e11c61ffbcd4bedfff4918dce5e135158d42656 Mon Sep 17 00:00:00 2001 From: ilmat192 Date: Tue, 13 Feb 2018 13:26:49 +0700 Subject: [PATCH] [klib] Fix printing type parameters in methods (#1319) --- .../kotlin/cli/klib/PrettyPrinter.kt | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/PrettyPrinter.kt b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/PrettyPrinter.kt index 8a00193f58d..10e13e7601e 100644 --- a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/PrettyPrinter.kt +++ b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/PrettyPrinter.kt @@ -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.parsePackageFragment 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.KonanLinkData @@ -93,6 +94,9 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, private val ProtoBuf.Class.classId: ClassId get() = nameResolver.getClassId(this.fqName) + private val ProtoBuf.TypeParameter.resolvedName: String + get() = nameResolver.getName(name).asString() + //-------------------------------------------------------------------------// object Indent { @@ -104,6 +108,7 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, //-------------------------------------------------------------------------// + // TODO: Replace with one context object TypeTables { val tables = mutableListOf() 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) } + object TypeParameterNames { + val typeParameters = mutableListOf>() + fun push(list: List) { + 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 @@ -147,6 +169,8 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, private fun ProtoBuf.Class.asString(): String { if (hasTypeTable()) TypeTables.push(typeTable) + TypeParameterNames.push(typeParameterList) + val result = buildString { val classId = nameResolver.getClassId(fqName) val className = if (!isCompanionObject) classId.shortClassName else "" @@ -184,6 +208,8 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, enumToEntries[classId]?.forEach { append(it.asString()) } } } + + TypeParameterNames.pop() if (hasTypeTable()) TypeTables.pop() return result } @@ -226,6 +252,8 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, private fun ProtoBuf.Function.asString(isInterface: Boolean = false): String { if (hasTypeTable()) TypeTables.push(typeTable) + TypeParameterNames.push(typeParameterList) + val result = buildString { val name = stringTable.getString(name) val visibility = Flags.VISIBILITY.get(flags).asString() @@ -239,6 +267,8 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, val returnType = returnType() append("$annotations$Indent$isExternal$modality$visibility${isInline}fun $typeParameters$receiverType$name$valueParameters$returnType\n") } + + TypeParameterNames.pop() if (hasTypeTable()) TypeTables.pop() return result } @@ -370,9 +400,10 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, //-------------------------------------------------------------------------// private fun ProtoBuf.Type.name() = when { - hasClassName() -> getName(className) + hasClassName() -> getName(className) + hasTypeParameter() -> TypeParameterNames.typeParameter(typeParameter)?.resolvedName ?: "undefined" hasTypeParameterName() -> stringTable.getString(typeParameterName) - hasTypeAliasName() -> stringTable.getString(typeAliasName) + hasTypeAliasName() -> stringTable.getString(typeAliasName) else -> "undefined" }