Simplify RuntimeTypeMapper, use Java reflection to get erased types
This commit is contained in:
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaConstructorDescriptor
|
|||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
|
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
|
||||||
import org.jetbrains.kotlin.load.java.structure.*
|
|
||||||
import org.jetbrains.kotlin.load.java.structure.reflect.*
|
import org.jetbrains.kotlin.load.java.structure.reflect.*
|
||||||
import org.jetbrains.kotlin.load.kotlin.SignatureDeserializer
|
import org.jetbrains.kotlin.load.kotlin.SignatureDeserializer
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
@@ -52,63 +51,30 @@ object RuntimeTypeMapper {
|
|||||||
return SignatureDeserializer(function.nameResolver).methodSignatureString(signature)
|
return SignatureDeserializer(function.nameResolver).methodSignatureString(signature)
|
||||||
}
|
}
|
||||||
else if (function is JavaMethodDescriptor) {
|
else if (function is JavaMethodDescriptor) {
|
||||||
val method = (function.getSource() as? JavaSourceElement)?.javaElement as? JavaMethod ?:
|
val method = ((function.source as? JavaSourceElement)?.javaElement as? ReflectJavaMethod)?.member ?:
|
||||||
throw KotlinReflectionInternalError("Incorrect resolution sequence for Java method $function")
|
throw KotlinReflectionInternalError("Incorrect resolution sequence for Java method $function")
|
||||||
|
|
||||||
return StringBuilder {
|
return StringBuilder {
|
||||||
append(method.getName().asString())
|
append(method.name)
|
||||||
appendParameters(method)
|
append("(")
|
||||||
appendJavaType(method.getReturnType())
|
method.parameterTypes.forEach { append(it.desc) }
|
||||||
|
append(")")
|
||||||
|
append(method.returnType.desc)
|
||||||
}.toString()
|
}.toString()
|
||||||
}
|
}
|
||||||
else if (function is JavaConstructorDescriptor) {
|
else if (function is JavaConstructorDescriptor) {
|
||||||
val constructor = (function.getSource() as? JavaSourceElement)?.javaElement as? JavaConstructor ?:
|
val constructor = ((function.source as? JavaSourceElement)?.javaElement as? ReflectJavaConstructor)?.member ?:
|
||||||
throw KotlinReflectionInternalError("Incorrect resolution sequence for Java constructor $function")
|
throw KotlinReflectionInternalError("Incorrect resolution sequence for Java constructor $function")
|
||||||
|
|
||||||
return StringBuilder {
|
return StringBuilder {
|
||||||
append("<init>")
|
append("<init>(")
|
||||||
appendParameters(constructor)
|
constructor.parameterTypes.forEach { append(it.desc) }
|
||||||
append("V")
|
append(")V")
|
||||||
}.toString()
|
}.toString()
|
||||||
}
|
}
|
||||||
else throw KotlinReflectionInternalError("Unknown origin of $function (${function.javaClass})")
|
else throw KotlinReflectionInternalError("Unknown origin of $function (${function.javaClass})")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun StringBuilder.appendParameters(callable: JavaCallable) {
|
|
||||||
append("(")
|
|
||||||
for (parameter in callable.getValueParameters()) {
|
|
||||||
appendJavaType(parameter.getType())
|
|
||||||
}
|
|
||||||
append(")")
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: verify edge cases when it's possible to reference generic functions
|
|
||||||
private tailRecursive fun StringBuilder.appendJavaType(type: JavaType) {
|
|
||||||
when (type) {
|
|
||||||
is JavaPrimitiveType -> {
|
|
||||||
append(type.getType()?.let { JvmPrimitiveType.get(it).getDesc() } ?: "V")
|
|
||||||
}
|
|
||||||
is JavaArrayType -> {
|
|
||||||
append("[")
|
|
||||||
appendJavaType(type.getComponentType())
|
|
||||||
}
|
|
||||||
is JavaWildcardType -> {
|
|
||||||
val bound = type.getBound()
|
|
||||||
if (bound != null && type.isExtends()) appendJavaType(bound)
|
|
||||||
else append("Ljava/lang/Object;")
|
|
||||||
}
|
|
||||||
is JavaClassifierType -> {
|
|
||||||
val classifier = type.getClassifier()
|
|
||||||
when (classifier) {
|
|
||||||
is ReflectJavaClass ->
|
|
||||||
append(classifier.element.desc)
|
|
||||||
is ReflectJavaTypeParameter ->
|
|
||||||
appendJavaType(ReflectJavaType.create(classifier.typeVariable.getBounds().first()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun mapPropertySignature(property: PropertyDescriptor): String {
|
fun mapPropertySignature(property: PropertyDescriptor): String {
|
||||||
if (property is DeserializedPropertyDescriptor) {
|
if (property is DeserializedPropertyDescriptor) {
|
||||||
val proto = property.proto
|
val proto = property.proto
|
||||||
@@ -133,13 +99,13 @@ object RuntimeTypeMapper {
|
|||||||
deserializer.typeDescriptor(field.getType())
|
deserializer.typeDescriptor(field.getType())
|
||||||
}
|
}
|
||||||
else if (property is JavaPropertyDescriptor) {
|
else if (property is JavaPropertyDescriptor) {
|
||||||
val method = (property.getSource() as? JavaSourceElement)?.javaElement as? JavaField ?:
|
val field = ((property.source as? JavaSourceElement)?.javaElement as? ReflectJavaField)?.member ?:
|
||||||
throw KotlinReflectionInternalError("Incorrect resolution sequence for Java field $property")
|
throw KotlinReflectionInternalError("Incorrect resolution sequence for Java field $property")
|
||||||
|
|
||||||
return StringBuilder {
|
return StringBuilder {
|
||||||
append(JvmAbi.getterName(method.getName().asString()))
|
append(JvmAbi.getterName(field.name))
|
||||||
append("()")
|
append("()")
|
||||||
appendJavaType(method.getType())
|
append(field.type.desc)
|
||||||
}.toString()
|
}.toString()
|
||||||
}
|
}
|
||||||
else throw KotlinReflectionInternalError("Unknown origin of $property (${property.javaClass})")
|
else throw KotlinReflectionInternalError("Unknown origin of $property (${property.javaClass})")
|
||||||
|
|||||||
Reference in New Issue
Block a user