diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt index 2e299a5553e..1e1cac8540b 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt @@ -316,8 +316,8 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader { - MemberSignature.fromMethodNameAndDesc(JvmProtoBufUtil.getJvmConstructorSignature(proto, nameResolver, typeTable)?.toString() ?: return null) + MemberSignature.fromJvmMemberSignature(JvmProtoBufUtil.getJvmConstructorSignature(proto, nameResolver, typeTable) ?: return null) } 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 -> { val signature = proto.getExtensionOrNull(propertySignature) ?: return null diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt index dc9e62baca4..d9bc4596480 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.load.kotlin import org.jetbrains.kotlin.metadata.deserialization.NameResolver 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 // into a map indexed by these signatures @@ -34,13 +35,14 @@ data class MemberSignature private constructor(internal val signature: String) { } @JvmStatic - fun fromMethodNameAndDesc(namePlusDesc: String): MemberSignature { - return MemberSignature(namePlusDesc) + fun fromFieldNameAndDesc(name: String, desc: String): MemberSignature { + return MemberSignature(name + "#" + desc) } @JvmStatic - fun fromFieldNameAndDesc(name: String, desc: String): MemberSignature { - return MemberSignature(name + "#" + desc) + fun fromJvmMemberSignature(signature: JvmMemberSignature): MemberSignature = when { + signature.isField -> fromFieldNameAndDesc(signature.name, signature.desc) + else -> fromMethodNameAndDesc(signature.name, signature.desc) } @JvmStatic diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMemberSignature.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMemberSignature.kt index a29e3b176e9..281fdc56fec 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMemberSignature.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMemberSignature.kt @@ -6,5 +6,16 @@ package org.jetbrains.kotlin.metadata.jvm.deserialization 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 } \ No newline at end of file diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt index 2d12b087726..30f84ae7eef 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.metadata.deserialization.TypeTable import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull 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.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -52,17 +53,30 @@ import kotlin.reflect.jvm.internal.structure.* internal sealed class JvmFunctionSignature { abstract fun asString(): String - class KotlinFunction(val signature: String) : JvmFunctionSignature() { - val methodName: String get() = signature.substringBefore('(') - val methodDesc: String get() = signature.substring(signature.indexOf('(')) + class KotlinFunction(val signature: JvmMemberSignature) : JvmFunctionSignature() { + private val _signature = signature.toString() - 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() { - val constructorDesc: String get() = signature.substring(signature.indexOf('(')) + class KotlinConstructor(val signature: JvmMemberSignature) : JvmFunctionSignature() { + 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() { @@ -172,12 +186,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.toString()) + return JvmFunctionSignature.KotlinFunction(signature) } } if (proto is ProtoBuf.Constructor) { 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 diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LightMemberOriginForCompiledElement.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LightMemberOriginForCompiledElement.kt index ba3a7ed7039..647d5a6c3a9 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LightMemberOriginForCompiledElement.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LightMemberOriginForCompiledElement.kt @@ -157,7 +157,7 @@ private object ByJvmSignatureIndexer : DecompiledTextIndexer - val signature = MemberSignature.fromMethodNameAndDesc(it.toString()) + val signature = MemberSignature.fromJvmMemberSignature(it) save((descriptor.containingDeclaration as? ClassDescriptor)?.relativeClassName().orEmpty(), signature) } } diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmMemberSignature.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmMemberSignature.kt index 99ea5f70402..daab66d4d07 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmMemberSignature.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmMemberSignature.kt @@ -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;` */ 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) \ No newline at end of file diff --git a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt index 3f1c3f62e2d..bc2e7f4d0a4 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt @@ -132,10 +132,7 @@ private fun visitProperty( sb.appendln(" // $versionRequirement") } if (jvmFieldDesc != null) { - // TODO: support that case in jvmFieldDesc.toString() - sb.append(" // field: ${jvmFieldDesc!!.name}") - sb.append(":").append(jvmFieldDesc!!.desc) - sb.appendln() + sb.appendln(" // field: $jvmFieldDesc") } if (jvmGetterDesc != null) { sb.appendln(" // getter: $jvmGetterDesc")