Fix KCallable.call for equals/hashCode/toString

Other built-in functions should be supported in the same way one day
This commit is contained in:
Alexander Udalov
2015-07-23 16:29:02 +03:00
parent 681c45ef61
commit be77a2feee
2 changed files with 18 additions and 14 deletions
@@ -60,7 +60,7 @@ open class KFunctionImpl protected constructor(
Visibilities.isPrivate(descriptor.visibility)) Visibilities.isPrivate(descriptor.visibility))
is JavaMethod -> jvmSignature.method is JavaMethod -> jvmSignature.method
is JavaConstructor -> jvmSignature.constructor is JavaConstructor -> jvmSignature.constructor
is BuiltInFunction -> throw KotlinReflectionInternalError("Built-in functions are not fully supported yet: $descriptor") is BuiltInFunction -> jvmSignature.getMember(container)
} }
when (member) { when (member) {
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
import java.lang.reflect.Constructor import java.lang.reflect.Constructor
import java.lang.reflect.Field import java.lang.reflect.Field
import java.lang.reflect.Member
import java.lang.reflect.Method import java.lang.reflect.Method
import kotlin.reflect.KotlinReflectionInternalError import kotlin.reflect.KotlinReflectionInternalError
@@ -67,8 +68,14 @@ sealed class JvmFunctionSignature {
"V" "V"
} }
class BuiltInFunction(private val signature: String) : JvmFunctionSignature() { open class BuiltInFunction(private val signature: String) : JvmFunctionSignature() {
open fun getMember(container: KCallableContainerImpl): Member? = null
override fun asString(): String = signature override fun asString(): String = signature
class Predefined(signature: String, private val member: Member): BuiltInFunction(signature) {
override fun getMember(container: KCallableContainerImpl): Member = member
}
} }
} }
@@ -159,20 +166,17 @@ object RuntimeTypeMapper {
val parameters = function.valueParameters val parameters = function.valueParameters
when (function.name.asString()) { when (function.name.asString()) {
"equals" -> { "equals" -> if (parameters.size() == 1 && KotlinBuiltIns.isNullableAny(parameters.single().type)) {
if (parameters.size() == 1 && KotlinBuiltIns.isNullableAny(parameters.single().type)) { return JvmFunctionSignature.BuiltInFunction.Predefined("equals(Ljava/lang/Object;)Z",
return JvmFunctionSignature.BuiltInFunction("equals(Ljava/lang/Object;)Z") javaClass<Any>().getDeclaredMethod("equals", javaClass<Any>()))
}
} }
"hashCode" -> { "hashCode" -> if (parameters.isEmpty()) {
if (parameters.isEmpty()) { return JvmFunctionSignature.BuiltInFunction.Predefined("hashCode()I",
return JvmFunctionSignature.BuiltInFunction("hashCode()I") javaClass<Any>().getDeclaredMethod("hashCode"))
}
} }
"toString" -> { "toString" -> if (parameters.isEmpty()) {
if (parameters.isEmpty()) { return JvmFunctionSignature.BuiltInFunction.Predefined("toString()Ljava/lang/String;",
return JvmFunctionSignature.BuiltInFunction("toString()Ljava/lang/String;") javaClass<Any>().getDeclaredMethod("toString"))
}
} }
// TODO: generalize and support other functions from built-ins // TODO: generalize and support other functions from built-ins
} }