Introduce JvmMemberSignature to represent name and desc of jvm methods and fields

Return member name and desc in a class in order not to parse that information
from concatenated string when required.
This commit is contained in:
Ilya Gorbunov
2018-05-27 18:14:16 +03:00
parent eee9f8ab3f
commit 36c658fd8b
12 changed files with 91 additions and 77 deletions
@@ -334,10 +334,10 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
): MemberSignature? {
return when {
proto is ProtoBuf.Constructor -> {
MemberSignature.fromMethodNameAndDesc(JvmProtoBufUtil.getJvmConstructorSignature(proto, nameResolver, typeTable) ?: return null)
MemberSignature.fromMethodNameAndDesc(JvmProtoBufUtil.getJvmConstructorSignature(proto, nameResolver, typeTable)?.toString() ?: return null)
}
proto is ProtoBuf.Function -> {
MemberSignature.fromMethodNameAndDesc(JvmProtoBufUtil.getJvmMethodSignature(proto, nameResolver, typeTable) ?: return null)
MemberSignature.fromMethodNameAndDesc(JvmProtoBufUtil.getJvmMethodSignature(proto, nameResolver, typeTable)?.toString() ?: return null)
}
proto is ProtoBuf.Property -> {
val signature = proto.getExtensionOrNull(propertySignature) ?: return null
@@ -0,0 +1,10 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.metadata.jvm.deserialization
data class JvmMemberSignature(val name: String, val desc: String) {
override fun toString() = name + desc
}
@@ -64,7 +64,7 @@ object JvmProtoBufUtil {
proto: ProtoBuf.Function,
nameResolver: NameResolver,
typeTable: TypeTable
): String? {
): JvmMemberSignature? {
val signature = proto.getExtensionOrNull(JvmProtoBuf.methodSignature)
val name = if (signature != null && signature.hasName()) signature.name else proto.name
val desc = if (signature != null && signature.hasDesc()) {
@@ -78,14 +78,14 @@ object JvmProtoBufUtil {
parametersDesc.joinToString(separator = "", prefix = "(", postfix = ")") + returnTypeDesc
}
return nameResolver.getString(name) + desc
return JvmMemberSignature(nameResolver.getString(name), desc)
}
fun getJvmConstructorSignature(
proto: ProtoBuf.Constructor,
nameResolver: NameResolver,
typeTable: TypeTable
): String? {
): JvmMemberSignature? {
val signature = proto.getExtensionOrNull(JvmProtoBuf.constructorSignature)
val desc = if (signature != null && signature.hasDesc()) {
nameResolver.getString(signature.desc)
@@ -95,14 +95,14 @@ object JvmProtoBufUtil {
mapTypeDefault(it.type(typeTable), nameResolver) ?: return null
}.joinToString(separator = "", prefix = "(", postfix = ")V")
}
return "<init>" + desc
return JvmMemberSignature("<init>", desc)
}
fun getJvmFieldSignature(
proto: ProtoBuf.Property,
nameResolver: NameResolver,
typeTable: TypeTable
): PropertySignature? {
): JvmMemberSignature? {
val signature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature) ?: return null
val field =
if (signature.hasField()) signature.field else null
@@ -112,10 +112,9 @@ object JvmProtoBufUtil {
if (field != null && field.hasDesc()) nameResolver.getString(field.desc)
else mapTypeDefault(proto.returnType(typeTable), nameResolver) ?: return null
return PropertySignature(nameResolver.getString(name), desc)
return JvmMemberSignature(nameResolver.getString(name), desc)
}
data class PropertySignature(val name: String, val desc: String)
private fun mapTypeDefault(type: ProtoBuf.Type, nameResolver: NameResolver): String? {
return if (type.hasClassName()) ClassMapperLite.mapClass(nameResolver.getQualifiedClassName(type.className)) else null
@@ -172,12 +172,12 @@ internal object RuntimeTypeMapper {
val proto = function.proto
if (proto is ProtoBuf.Function) {
JvmProtoBufUtil.getJvmMethodSignature(proto, function.nameResolver, function.typeTable)?.let { signature ->
return JvmFunctionSignature.KotlinFunction(signature)
return JvmFunctionSignature.KotlinFunction(signature.toString())
}
}
if (proto is ProtoBuf.Constructor) {
JvmProtoBufUtil.getJvmConstructorSignature(proto, function.nameResolver, function.typeTable)?.let { signature ->
return JvmFunctionSignature.KotlinConstructor(signature)
return JvmFunctionSignature.KotlinConstructor(signature.toString())
}
}
// If it's a deserialized function but has no JVM signature, it must be from built-ins