Improve toString() for lambdas and function expressions

#KT-9952 Fixed
This commit is contained in:
Alexander Udalov
2016-02-15 18:04:40 +03:00
parent bab127ad33
commit eef3631b8a
8 changed files with 102 additions and 19 deletions
@@ -18,6 +18,8 @@ package kotlin.reflect.jvm.internal;
import kotlin.jvm.internal.*;
import kotlin.reflect.*;
import kotlin.reflect.jvm.ReflectLambdaKt;
import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
/**
* @suppress
@@ -49,6 +51,18 @@ public class ReflectionFactoryImpl extends ReflectionFactory {
return KClassCacheKt.getOrCreateKotlinClass(javaClass);
}
@Override
public String renderLambdaToString(Lambda lambda) {
KFunction kFunction = ReflectLambdaKt.reflect(lambda);
if (kFunction != null) {
KFunctionImpl impl = UtilKt.asKFunctionImpl(kFunction);
if (impl != null) {
return ReflectionObjectRenderer.INSTANCE.renderLambda(impl.getDescriptor());
}
}
return super.renderLambdaToString(lambda);
}
// Functions
@Override
@@ -34,7 +34,7 @@ internal object ReflectionObjectRenderer {
}
}
private fun StringBuilder.appendReceiversAndName(callable: CallableDescriptor) {
private fun StringBuilder.appendReceivers(callable: CallableDescriptor) {
val dispatchReceiver = callable.dispatchReceiverParameter
val extensionReceiver = callable.extensionReceiverParameter
@@ -44,8 +44,6 @@ internal object ReflectionObjectRenderer {
if (addParentheses) append("(")
appendReceiverType(extensionReceiver)
if (addParentheses) append(")")
append(renderer.renderName(callable.name))
}
fun renderCallable(descriptor: CallableDescriptor): String {
@@ -60,7 +58,8 @@ internal object ReflectionObjectRenderer {
fun renderProperty(descriptor: PropertyDescriptor): String {
return buildString {
append(if (descriptor.isVar) "var " else "val ")
appendReceiversAndName(descriptor)
appendReceivers(descriptor)
append(renderer.renderName(descriptor.name))
append(": ")
append(renderType(descriptor.type))
@@ -70,7 +69,8 @@ internal object ReflectionObjectRenderer {
fun renderFunction(descriptor: FunctionDescriptor): String {
return buildString {
append("fun ")
appendReceiversAndName(descriptor)
appendReceivers(descriptor)
append(renderer.renderName(descriptor.name))
descriptor.valueParameters.joinTo(this, separator = ", ", prefix = "(", postfix = ")") {
renderType(it.type) // TODO: vararg
@@ -81,6 +81,19 @@ internal object ReflectionObjectRenderer {
}
}
fun renderLambda(invoke: FunctionDescriptor): String {
return buildString {
appendReceivers(invoke)
invoke.valueParameters.joinTo(this, separator = ", ", prefix = "(", postfix = ")") {
renderType(it.type)
}
append(" -> ")
append(renderType(invoke.returnType!!))
}
}
fun renderParameter(parameter: KParameterImpl): String {
return buildString {
when (parameter.kind) {