Print callable reference as value parameter

This commit is contained in:
Konstantin Anisimov
2017-06-19 14:33:47 +07:00
committed by KonstantinAnisimov
parent 531540c8d3
commit f70835fc29
@@ -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()) {