Provide equals/hashCode/toString for KParameter implementation

Two KParameter instances are equal iff their backing descriptors are equal and
their callables are equal
This commit is contained in:
Alexander Udalov
2015-08-24 17:33:36 +03:00
parent d4825cf4f0
commit d36ef90dd6
5 changed files with 97 additions and 0 deletions
@@ -41,4 +41,13 @@ class KParameterImpl(
override val type: KType
get() = KTypeImpl(descriptor.type) { callable.caller.parameterTypes[index] }
override fun equals(other: Any?) =
other is KParameterImpl && callable == other.callable && descriptor == other.descriptor
override fun hashCode() =
(callable.hashCode() * 31) + descriptor.hashCode()
override fun toString() =
ReflectionObjectRenderer.renderParameter(this)
}
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.types.JetType
import kotlin.reflect.KParameter
object ReflectionObjectRenderer {
private val renderer = DescriptorRenderer.FQ_NAMES_IN_TYPES
@@ -47,6 +48,14 @@ object ReflectionObjectRenderer {
append(renderer.renderName(callable.name))
}
fun renderCallable(descriptor: CallableDescriptor): String {
return when (descriptor) {
is PropertyDescriptor -> renderProperty(descriptor)
is FunctionDescriptor -> renderFunction(descriptor)
else -> error("Illegal callable: $descriptor")
}
}
// TODO: include visibility, return type
fun renderProperty(descriptor: PropertyDescriptor): String {
return StringBuilder {
@@ -69,6 +78,19 @@ object ReflectionObjectRenderer {
}.toString()
}
fun renderParameter(parameter: KParameterImpl): String {
return StringBuilder {
when (parameter.kind) {
KParameter.Kind.EXTENSION_RECEIVER -> append("extension receiver")
KParameter.Kind.INSTANCE -> append("instance")
KParameter.Kind.VALUE -> append("parameter #${parameter.index} ${parameter.name}")
}
append(" of ")
append(renderCallable(parameter.callable.descriptor))
}.toString()
}
fun renderType(type: JetType): String {
return renderer.renderType(type)
}