Refactor: allow to distinguish whether JvmMemberSignature is for field or for method
Introduce a method to create org.jetbrains.kotlin.load.kotlin.MemberSignature directly from JvmMemberSignature. Create JvmFunctionSignature from JvmMemberSignature.
This commit is contained in:
+4
-4
@@ -316,8 +316,8 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
|
|||||||
val signature = proto.getExtensionOrNull(propertySignature) ?: return null
|
val signature = proto.getExtensionOrNull(propertySignature) ?: return null
|
||||||
|
|
||||||
if (field) {
|
if (field) {
|
||||||
val (name, desc) = JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver, typeTable) ?: return null
|
val fieldSignature = JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver, typeTable) ?: return null
|
||||||
return MemberSignature.fromFieldNameAndDesc(name, desc)
|
return MemberSignature.fromJvmMemberSignature(fieldSignature)
|
||||||
}
|
}
|
||||||
else if (synthetic && signature.hasSyntheticMethod()) {
|
else if (synthetic && signature.hasSyntheticMethod()) {
|
||||||
return MemberSignature.fromMethod(nameResolver, signature.syntheticMethod)
|
return MemberSignature.fromMethod(nameResolver, signature.syntheticMethod)
|
||||||
@@ -334,10 +334,10 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
|
|||||||
): MemberSignature? {
|
): MemberSignature? {
|
||||||
return when {
|
return when {
|
||||||
proto is ProtoBuf.Constructor -> {
|
proto is ProtoBuf.Constructor -> {
|
||||||
MemberSignature.fromMethodNameAndDesc(JvmProtoBufUtil.getJvmConstructorSignature(proto, nameResolver, typeTable)?.toString() ?: return null)
|
MemberSignature.fromJvmMemberSignature(JvmProtoBufUtil.getJvmConstructorSignature(proto, nameResolver, typeTable) ?: return null)
|
||||||
}
|
}
|
||||||
proto is ProtoBuf.Function -> {
|
proto is ProtoBuf.Function -> {
|
||||||
MemberSignature.fromMethodNameAndDesc(JvmProtoBufUtil.getJvmMethodSignature(proto, nameResolver, typeTable)?.toString() ?: return null)
|
MemberSignature.fromJvmMemberSignature(JvmProtoBufUtil.getJvmMethodSignature(proto, nameResolver, typeTable) ?: return null)
|
||||||
}
|
}
|
||||||
proto is ProtoBuf.Property -> {
|
proto is ProtoBuf.Property -> {
|
||||||
val signature = proto.getExtensionOrNull(propertySignature) ?: return null
|
val signature = proto.getExtensionOrNull(propertySignature) ?: return null
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.load.kotlin
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
|
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
|
||||||
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
|
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
|
||||||
|
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature
|
||||||
|
|
||||||
// The purpose of this class is to hold a unique signature of either a method or a field, so that annotations on a member can be put
|
// The purpose of this class is to hold a unique signature of either a method or a field, so that annotations on a member can be put
|
||||||
// into a map indexed by these signatures
|
// into a map indexed by these signatures
|
||||||
@@ -34,13 +35,14 @@ data class MemberSignature private constructor(internal val signature: String) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun fromMethodNameAndDesc(namePlusDesc: String): MemberSignature {
|
fun fromFieldNameAndDesc(name: String, desc: String): MemberSignature {
|
||||||
return MemberSignature(namePlusDesc)
|
return MemberSignature(name + "#" + desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun fromFieldNameAndDesc(name: String, desc: String): MemberSignature {
|
fun fromJvmMemberSignature(signature: JvmMemberSignature): MemberSignature = when {
|
||||||
return MemberSignature(name + "#" + desc)
|
signature.isField -> fromFieldNameAndDesc(signature.name, signature.desc)
|
||||||
|
else -> fromMethodNameAndDesc(signature.name, signature.desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
|
|||||||
+12
-1
@@ -6,5 +6,16 @@
|
|||||||
package org.jetbrains.kotlin.metadata.jvm.deserialization
|
package org.jetbrains.kotlin.metadata.jvm.deserialization
|
||||||
|
|
||||||
data class JvmMemberSignature(val name: String, val desc: String) {
|
data class JvmMemberSignature(val name: String, val desc: String) {
|
||||||
override fun toString() = name + desc
|
|
||||||
|
/**
|
||||||
|
* Returns `true` when this signature represents a field.
|
||||||
|
*/
|
||||||
|
val isField: Boolean = desc.indexOf(")") < 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns `true` when this signature represents a method.
|
||||||
|
*/
|
||||||
|
val isMethod: Boolean get() = !isField
|
||||||
|
|
||||||
|
override fun toString() = if (isField) name + ":" + desc else name + desc
|
||||||
}
|
}
|
||||||
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.metadata.deserialization.NameResolver
|
|||||||
import org.jetbrains.kotlin.metadata.deserialization.TypeTable
|
import org.jetbrains.kotlin.metadata.deserialization.TypeTable
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull
|
import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull
|
||||||
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
|
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
|
||||||
|
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature
|
||||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
|
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -52,17 +53,30 @@ import kotlin.reflect.jvm.internal.structure.*
|
|||||||
internal sealed class JvmFunctionSignature {
|
internal sealed class JvmFunctionSignature {
|
||||||
abstract fun asString(): String
|
abstract fun asString(): String
|
||||||
|
|
||||||
class KotlinFunction(val signature: String) : JvmFunctionSignature() {
|
class KotlinFunction(val signature: JvmMemberSignature) : JvmFunctionSignature() {
|
||||||
val methodName: String get() = signature.substringBefore('(')
|
private val _signature = signature.toString()
|
||||||
val methodDesc: String get() = signature.substring(signature.indexOf('('))
|
|
||||||
|
|
||||||
override fun asString(): String = signature
|
init {
|
||||||
|
require(signature.isMethod)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val methodName: String get() = signature.name
|
||||||
|
val methodDesc: String get() = signature.desc
|
||||||
|
|
||||||
|
override fun asString(): String = _signature
|
||||||
}
|
}
|
||||||
|
|
||||||
class KotlinConstructor(val signature: String) : JvmFunctionSignature() {
|
class KotlinConstructor(val signature: JvmMemberSignature) : JvmFunctionSignature() {
|
||||||
val constructorDesc: String get() = signature.substring(signature.indexOf('('))
|
private val _signature = signature.toString()
|
||||||
|
|
||||||
override fun asString(): String = signature
|
init {
|
||||||
|
require(signature.isMethod)
|
||||||
|
}
|
||||||
|
|
||||||
|
val constructorDesc: String get() = signature.desc
|
||||||
|
|
||||||
|
override fun asString(): String = _signature
|
||||||
}
|
}
|
||||||
|
|
||||||
class JavaMethod(val method: Method) : JvmFunctionSignature() {
|
class JavaMethod(val method: Method) : JvmFunctionSignature() {
|
||||||
@@ -172,12 +186,12 @@ internal object RuntimeTypeMapper {
|
|||||||
val proto = function.proto
|
val proto = function.proto
|
||||||
if (proto is ProtoBuf.Function) {
|
if (proto is ProtoBuf.Function) {
|
||||||
JvmProtoBufUtil.getJvmMethodSignature(proto, function.nameResolver, function.typeTable)?.let { signature ->
|
JvmProtoBufUtil.getJvmMethodSignature(proto, function.nameResolver, function.typeTable)?.let { signature ->
|
||||||
return JvmFunctionSignature.KotlinFunction(signature.toString())
|
return JvmFunctionSignature.KotlinFunction(signature)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (proto is ProtoBuf.Constructor) {
|
if (proto is ProtoBuf.Constructor) {
|
||||||
JvmProtoBufUtil.getJvmConstructorSignature(proto, function.nameResolver, function.typeTable)?.let { signature ->
|
JvmProtoBufUtil.getJvmConstructorSignature(proto, function.nameResolver, function.typeTable)?.let { signature ->
|
||||||
return JvmFunctionSignature.KotlinConstructor(signature.toString())
|
return JvmFunctionSignature.KotlinConstructor(signature)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If it's a deserialized function but has no JVM signature, it must be from built-ins
|
// If it's a deserialized function but has no JVM signature, it must be from built-ins
|
||||||
|
|||||||
+1
-1
@@ -157,7 +157,7 @@ private object ByJvmSignatureIndexer : DecompiledTextIndexer<ClassNameAndSignatu
|
|||||||
|
|
||||||
if (descriptor is DeserializedSimpleFunctionDescriptor) {
|
if (descriptor is DeserializedSimpleFunctionDescriptor) {
|
||||||
JvmProtoBufUtil.getJvmMethodSignature(descriptor.proto, descriptor.nameResolver, descriptor.typeTable)?.let { it ->
|
JvmProtoBufUtil.getJvmMethodSignature(descriptor.proto, descriptor.nameResolver, descriptor.typeTable)?.let { it ->
|
||||||
val signature = MemberSignature.fromMethodNameAndDesc(it.toString())
|
val signature = MemberSignature.fromJvmMemberSignature(it)
|
||||||
save((descriptor.containingDeclaration as? ClassDescriptor)?.relativeClassName().orEmpty(), signature)
|
save((descriptor.containingDeclaration as? ClassDescriptor)?.relativeClassName().orEmpty(), signature)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,18 @@ package kotlinx.metadata.jvm
|
|||||||
* @property desc JVM descriptor of a method, e.g. `(Ljava/lang/Object;)Z`, or a field type, e.g. `Ljava/lang/String;`
|
* @property desc JVM descriptor of a method, e.g. `(Ljava/lang/Object;)Z`, or a field type, e.g. `Ljava/lang/String;`
|
||||||
*/
|
*/
|
||||||
data class JvmMemberSignature(val name: String, val desc: String) {
|
data class JvmMemberSignature(val name: String, val desc: String) {
|
||||||
override fun toString() = name + desc
|
|
||||||
|
/**
|
||||||
|
* Returns `true` when this signature represents a field.
|
||||||
|
*/
|
||||||
|
val isField: Boolean get() = desc.indexOf("(") < 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns `true` when this signature represents a method.
|
||||||
|
*/
|
||||||
|
val isMethod: Boolean get() = desc.indexOf("(") >= 0
|
||||||
|
|
||||||
|
override fun toString() = if (isField) name + ":" + desc else name + desc
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature.wrapAsPublic() = JvmMemberSignature(name, desc)
|
internal fun org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature.wrapAsPublic() = JvmMemberSignature(name, desc)
|
||||||
@@ -132,10 +132,7 @@ private fun visitProperty(
|
|||||||
sb.appendln(" // $versionRequirement")
|
sb.appendln(" // $versionRequirement")
|
||||||
}
|
}
|
||||||
if (jvmFieldDesc != null) {
|
if (jvmFieldDesc != null) {
|
||||||
// TODO: support that case in jvmFieldDesc.toString()
|
sb.appendln(" // field: $jvmFieldDesc")
|
||||||
sb.append(" // field: ${jvmFieldDesc!!.name}")
|
|
||||||
sb.append(":").append(jvmFieldDesc!!.desc)
|
|
||||||
sb.appendln()
|
|
||||||
}
|
}
|
||||||
if (jvmGetterDesc != null) {
|
if (jvmGetterDesc != null) {
|
||||||
sb.appendln(" // getter: $jvmGetterDesc")
|
sb.appendln(" // getter: $jvmGetterDesc")
|
||||||
|
|||||||
Reference in New Issue
Block a user