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 6bee938481d..029e7c2228c 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 @@ -133,9 +133,10 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, val annotations = protoFunction.getExtension(KonanSerializerProtocol.functionAnnotation) val typeParameters = typeParametersToString(protoFunction.typeParameterList) val valueParameters = valueParametersToString(protoFunction.valueParameterList) + val returnType = typeToString(protoFunction.returnTypeId) printAnnotations(annotations) - printer.println("$visibility${isInline}fun $typeParameters$receiverType$name$valueParameters") + printer.println("$visibility${isInline}fun $typeParameters$receiverType$name$valueParameters: $returnType") } //-------------------------------------------------------------------------// @@ -434,8 +435,9 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, fun typeToString(typeId: Int): String { val type = typeTable!!.getType(typeId) - val buff = StringBuilder(typeName(type)) + if (isCallableType(type)) return callableTypeToString(type) + val buff = StringBuilder(typeName(type)) val argumentList = type.argumentList if (argumentList.isNotEmpty()) { buff.append("<") @@ -452,6 +454,24 @@ class PackageFragmentPrinter(val packageFragment: KonanLinkData.PackageFragment, //-------------------------------------------------------------------------// + fun isCallableType(type: ProtoBuf.Type) = typeName(type).contains("Function") + + //-------------------------------------------------------------------------// + + fun callableTypeToString(callableType: ProtoBuf.Type): String { + val buff = StringBuilder("(") + val argumentTypes = callableType.argumentList.dropLast(1) + val returnType = callableType.argumentList.lastOrNull() + + argumentTypes.dropLast(1).forEach { buff.append("${typeToString(it.typeId)}, ") } + argumentTypes.lastOrNull()?.let { buff.append(typeToString(it.typeId)) } + buff.append(") -> ") + if (returnType != null) buff.append(typeToString(returnType.typeId)) + return buff.toString() + } + + //-------------------------------------------------------------------------// + fun typeName(type: ProtoBuf.Type): String { var typeName = "undefined" if (type.hasClassName()) {