From f70835fc291cd99d750321996f7100f01089cf4d Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Mon, 19 Jun 2017 14:33:47 +0700 Subject: [PATCH] Print callable reference as value parameter --- .../kotlin/cli/klib/PrettyPrinter.kt | 24 +++++++++++++++++-- 1 file changed, 22 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 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()) {