diff --git a/libraries/kotlinx-metadata/jvm/ReadMe.md b/libraries/kotlinx-metadata/jvm/ReadMe.md index dd8a59262fe..c442dc4e993 100644 --- a/libraries/kotlinx-metadata/jvm/ReadMe.md +++ b/libraries/kotlinx-metadata/jvm/ReadMe.md @@ -99,7 +99,7 @@ val header = KotlinClassMetadata.Class.Writer().run { visitConstructor(flagsOf(Flag.IS_PUBLIC, Flag.Constructor.IS_PRIMARY))!!.run { // Visiting JVM signature (for example, to be used by kotlin-reflect) (visitExtensions(JvmConstructorExtensionVisitor.TYPE) as JvmConstructorExtensionVisitor).run { - visit("()V") + visit(JvmMethodSignature("", "()V")) } // Not forgetting to call visitEnd at the end of visit of the declaration 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 e64d5e72533..1dee9c416b8 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmMemberSignature.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmMemberSignature.kt @@ -7,7 +7,7 @@ package kotlinx.metadata.jvm import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature as JvmMemberSignatureImpl /** - * A signature of JVM method or field + * A signature of a JVM method or field. * * @property name name of method or field * @property desc JVM descriptor of a method, e.g. `(Ljava/lang/Object;)Z`, or a field type, e.g. `Ljava/lang/String;` @@ -17,19 +17,36 @@ sealed class JvmMemberSignature { abstract val name: String abstract val desc: String - data class Method(override val name: String, override val desc: String) : JvmMemberSignature() { - override fun asString() = name + desc - } - - data class Field(override val name: String, override val desc: String) : JvmMemberSignature() { - override fun asString() = name + ":" + desc - } + /** + * Returns a string representation of the signature. + * + * In case of a method it's just [name] and [desc] concatenated together, e.g. `equals(Ljava/lang/Object;)Z` + * + * In case of a field [name] and [desc] are concatenated with `:` separator, e.g. `value:Ljava/lang/String;` + */ + abstract fun asString(): String final override fun toString() = asString() - abstract fun asString(): String } -internal fun JvmMemberSignatureImpl.wrapAsPublic() = when (this) { - is JvmMemberSignatureImpl.Method -> JvmMemberSignature.Method(name, desc) - is JvmMemberSignatureImpl.Field -> JvmMemberSignature.Field(name, desc) -} \ No newline at end of file +/** + * A signature of a JVM method. + * + * @see JvmMemberSignature + */ +data class JvmMethodSignature(override val name: String, override val desc: String) : JvmMemberSignature() { + override fun asString() = name + desc +} + +/** + * A signature of a JVM field. + * + * @see JvmMemberSignature + */ +data class JvmFieldSignature(override val name: String, override val desc: String) : JvmMemberSignature() { + override fun asString() = name + ":" + desc +} + + +internal fun JvmMemberSignatureImpl.Method.wrapAsPublic() = JvmMethodSignature(name, desc) +internal fun JvmMemberSignatureImpl.Field.wrapAsPublic() = JvmFieldSignature(name, desc) \ No newline at end of file diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt index d3003feeecc..77f928848ea 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt @@ -48,13 +48,13 @@ internal class JvmMetadataExtensions : MetadataExtensions { if (propertySignature != null && propertySignature.hasSetter()) propertySignature.setter else null ext.visit( fieldSignature?.wrapAsPublic(), - getterSignature?.run { JvmMemberSignature.Method(strings.getString(name), strings.getString(desc)) }, - setterSignature?.run { JvmMemberSignature.Method(strings.getString(name), strings.getString(desc)) } + getterSignature?.run { JvmMethodSignature(strings.getString(name), strings.getString(desc)) }, + setterSignature?.run { JvmMethodSignature(strings.getString(name), strings.getString(desc)) } ) val syntheticMethod = if (propertySignature != null && propertySignature.hasSyntheticMethod()) propertySignature.syntheticMethod else null - ext.visitSyntheticMethodForAnnotations(syntheticMethod?.run { JvmMemberSignature.Method(strings.getString(name), strings.getString(desc)) }) + ext.visitSyntheticMethodForAnnotations(syntheticMethod?.run { JvmMethodSignature(strings.getString(name), strings.getString(desc)) }) ext.visitEnd() } @@ -97,7 +97,7 @@ internal class JvmMetadataExtensions : MetadataExtensions { ): KmFunctionExtensionVisitor? { if (type != JvmFunctionExtensionVisitor.TYPE) return null return object : JvmFunctionExtensionVisitor() { - override fun visit(desc: JvmMemberSignature?) { + override fun visit(desc: JvmMethodSignature?) { if (desc != null) { proto.setExtension(JvmProtoBuf.methodSignature, desc.toJvmMethodSignature(strings)) } @@ -116,7 +116,7 @@ internal class JvmMetadataExtensions : MetadataExtensions { return object : JvmPropertyExtensionVisitor() { var signature: JvmProtoBuf.JvmPropertySignature.Builder? = null - override fun visit(fieldDesc: JvmMemberSignature?, getterDesc: JvmMemberSignature?, setterDesc: JvmMemberSignature?) { + override fun visit(fieldDesc: JvmFieldSignature?, getterDesc: JvmMethodSignature?, setterDesc: JvmMethodSignature?) { if (fieldDesc == null && getterDesc == null && setterDesc == null) return if (signature == null) { @@ -138,7 +138,7 @@ internal class JvmMetadataExtensions : MetadataExtensions { } } - override fun visitSyntheticMethodForAnnotations(desc: JvmMemberSignature?) { + override fun visitSyntheticMethodForAnnotations(desc: JvmMethodSignature?) { if (desc == null) return if (signature == null) { @@ -161,7 +161,7 @@ internal class JvmMetadataExtensions : MetadataExtensions { ): KmConstructorExtensionVisitor? { if (type != JvmConstructorExtensionVisitor.TYPE) return null return object : JvmConstructorExtensionVisitor() { - override fun visit(desc: JvmMemberSignature?) { + override fun visit(desc: JvmMethodSignature?) { if (desc != null) { proto.setExtension(JvmProtoBuf.constructorSignature, desc.toJvmMethodSignature(strings)) } diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt index ea7122b6d61..cce079c0cc1 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt @@ -40,12 +40,14 @@ open class JvmFunctionExtensionVisitor @JvmOverloads constructor( private val delegate: JvmFunctionExtensionVisitor? = null ) : KmFunctionExtensionVisitor { /** - * Visits the JVM signature of the function, in the JVM-based format: `"equals(Ljava/lang/Object;)Z"`, + * Visits the JVM signature of the function in the JVM-based format, * or null if the JVM signature of this function is unknown. * + * Example: `JvmMethodSignature("equals", "(Ljava/lang/Object;)Z")` + * * @param desc the signature of the function */ - open fun visit(desc: JvmMemberSignature?) { + open fun visit(desc: JvmMethodSignature?) { delegate?.visit(desc) } @@ -77,24 +79,29 @@ open class JvmPropertyExtensionVisitor @JvmOverloads constructor( /** * Visits JVM signatures of field and accessors generated for the property. * - * @param fieldName the name of the field, or `null` if this property has no field - * @param fieldTypeDesc the type of the field in the JVM-based format (`"Ljava/lang/Object;"`), or `null` if this property has no field - * @param getterDesc the signature of the property getter in the JVM-based format: `"getX()Ljava/lang/Object;"`, - * or `null` if this property has no getter or its signature is unknown - * @param setterDesc the signature of the property setter in the JVM-based format: `"setX(Ljava/lang/Object;)V"`, + * @param fieldDesc the name and the type of the field in the JVM-based format, or `null` if this property has no field. + * Example: `JvmFieldSignature("X", "Ljava/lang/Object;")` + * + * @param getterDesc the signature of the property getter in the JVM-based format, + * or `null` if this property has no getter or its signature is unknown. + * Example: `JvmMethodSignature("getX()", "Ljava/lang/Object;")` + * + * @param setterDesc the signature of the property setter in the JVM-based format, * or `null` if this property has no setter or its signature is unknown + * Example: `JvmMethodSignature("setX", "(Ljava/lang/Object;)V")`, */ - open fun visit(fieldDesc: JvmMemberSignature?, getterDesc: JvmMemberSignature?, setterDesc: JvmMemberSignature?) { + open fun visit(fieldDesc: JvmFieldSignature?, getterDesc: JvmMethodSignature?, setterDesc: JvmMethodSignature?) { delegate?.visit(fieldDesc, getterDesc, setterDesc) } /** - * Visits the JVM signature of a synthetic method which is generated to store annotations on a property in the bytecode, - * in the JVM-based format: `"getX$annotations()V"` + * Visits the JVM signature of a synthetic method which is generated to store annotations on a property in the bytecode. + * + * Example: `JvmMethodSignature("getX$annotations", "()V")` * * @param desc the signature of the synthetic method */ - open fun visitSyntheticMethodForAnnotations(desc: JvmMemberSignature?) { + open fun visitSyntheticMethodForAnnotations(desc: JvmMethodSignature?) { delegate?.visitSyntheticMethodForAnnotations(desc) } @@ -123,12 +130,14 @@ open class JvmConstructorExtensionVisitor @JvmOverloads constructor( private val delegate: JvmConstructorExtensionVisitor? = null ) : KmConstructorExtensionVisitor { /** - * Visits the JVM signature of the constructor, in the JVM-based format: `"(Ljava/lang/Object;)V"`, + * Visits the JVM signature of the constructor in the JVM-based format, * or null if the JVM signature of this constructor is unknown. * + * Example: `JvmMethodSignature("", "(Ljava/lang/Object;)V")` + * * @param desc the signature of the constructor */ - open fun visit(desc: JvmMemberSignature?) { + open fun visit(desc: JvmMethodSignature?) { delegate?.visit(desc) } diff --git a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt index c2f0065b6b7..d9c2868bfe5 100644 --- a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt +++ b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt @@ -6,10 +6,7 @@ package kotlinx.metadata.test import kotlinx.metadata.* -import kotlinx.metadata.jvm.JvmConstructorExtensionVisitor -import kotlinx.metadata.jvm.JvmFunctionExtensionVisitor -import kotlinx.metadata.jvm.KotlinClassHeader -import kotlinx.metadata.jvm.KotlinClassMetadata +import kotlinx.metadata.jvm.* import org.jetbrains.org.objectweb.asm.ClassWriter import org.jetbrains.org.objectweb.asm.Opcodes import org.junit.Assert.assertEquals @@ -44,9 +41,9 @@ class MetadataSmokeTest { if (type != JvmFunctionExtensionVisitor.TYPE) return null return object : JvmFunctionExtensionVisitor() { - override fun visit(desc: String?) { + override fun visit(desc: JvmMethodSignature?) { if (Flag.Function.IS_INLINE(flags) && desc != null) { - inlineFunctions += desc + inlineFunctions += desc.asString() } } } @@ -72,7 +69,7 @@ class MetadataSmokeTest { visit(flagsOf(Flag.IS_PUBLIC), "Hello") visitConstructor(flagsOf(Flag.IS_PUBLIC, Flag.Constructor.IS_PRIMARY))!!.run { (visitExtensions(JvmConstructorExtensionVisitor.TYPE) as JvmConstructorExtensionVisitor).run { - visit("()V") + visit(JvmMethodSignature("", "()V")) } visitEnd() } @@ -82,7 +79,7 @@ class MetadataSmokeTest { visitEnd() } (visitExtensions(JvmFunctionExtensionVisitor.TYPE) as JvmFunctionExtensionVisitor).run { - visit("hello()Ljava/lang/String;") + visit(JvmMethodSignature("hello", "()Ljava/lang/String;")) } visitEnd() } diff --git a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/PublicApiDump.kt b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/PublicApiDump.kt index 439d41df985..9da6ddadf1e 100644 --- a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/PublicApiDump.kt +++ b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/PublicApiDump.kt @@ -5,11 +5,12 @@ package org.jetbrains.kotlin.tools +import kotlinx.metadata.jvm.JvmFieldSignature +import kotlinx.metadata.jvm.JvmMethodSignature import org.objectweb.asm.* import org.objectweb.asm.tree.* import java.io.InputStream import java.util.jar.JarFile -import kotlinx.metadata.jvm.JvmMemberSignature as MemberSignature fun main(args: Array) { val src = args[0] @@ -44,8 +45,8 @@ fun getBinaryAPI(classStreams: Sequence, visibilityFilter: (String) val supertypes = listOf(superName) - "java/lang/Object" + interfaces.sorted() val memberSignatures = ( - fields.map { with(it) { FieldBinarySignature(MemberSignature.Field(name, desc), isPublishedApi(), AccessFlags(access)) } } + - methods.map { with(it) { MethodBinarySignature(MemberSignature.Method(name, desc), isPublishedApi(), AccessFlags(access)) } } + fields.map { with(it) { FieldBinarySignature(JvmFieldSignature(name, desc), isPublishedApi(), AccessFlags(access)) } } + + methods.map { with(it) { MethodBinarySignature(JvmMethodSignature(name, desc), isPublishedApi(), AccessFlags(access)) } } ).filter { it.isEffectivelyPublic(classAccess, mVisibility) } diff --git a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/asmUtils.kt b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/asmUtils.kt index 00fb7cff340..cca25380b5c 100644 --- a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/asmUtils.kt +++ b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/asmUtils.kt @@ -5,11 +5,10 @@ package org.jetbrains.kotlin.tools -import kotlinx.metadata.jvm.KotlinClassMetadata +import kotlinx.metadata.jvm.* import org.objectweb.asm.Opcodes import org.objectweb.asm.tree.* import kotlin.comparisons.* -import kotlinx.metadata.jvm.JvmMemberSignature as MemberSignature val ACCESS_NAMES = mapOf( Opcodes.ACC_PUBLIC to "public", @@ -39,7 +38,7 @@ data class ClassBinarySignature( interface MemberBinarySignature { - val jvmMember: MemberSignature + val jvmMember: JvmMemberSignature val name: String get() = jvmMember.name val desc: String get() = jvmMember.desc val access: AccessFlags @@ -57,7 +56,7 @@ interface MemberBinarySignature { } data class MethodBinarySignature( - override val jvmMember: MemberSignature, + override val jvmMember: JvmMethodSignature, override val isPublishedApi: Boolean, override val access: AccessFlags ) : MemberBinarySignature { @@ -84,20 +83,23 @@ data class MethodBinarySignature( * or a constructor with default parameters. * Returns an incorrect result, if there are more than 31 default parameters. */ - private fun alternateDefaultSignature(className: String): MemberSignature? { + private fun alternateDefaultSignature(className: String): JvmMethodSignature? { return when { !access.isSynthetic -> null name == "" && "ILkotlin/jvm/internal/DefaultConstructorMarker;" in desc -> - MemberSignature.Method(name, desc.replace("ILkotlin/jvm/internal/DefaultConstructorMarker;", "")) + JvmMethodSignature(name, desc.replace("ILkotlin/jvm/internal/DefaultConstructorMarker;", "")) name.endsWith("\$default") && "ILjava/lang/Object;)" in desc -> - MemberSignature.Method(name.removeSuffix("\$default"), desc.replace("ILjava/lang/Object;)", ")").replace("(L$className;", "(")) + JvmMethodSignature( + name.removeSuffix("\$default"), + desc.replace("ILjava/lang/Object;)", ")").replace("(L$className;", "(") + ) else -> null } } } data class FieldBinarySignature( - override val jvmMember: MemberSignature, + override val jvmMember: JvmFieldSignature, override val isPublishedApi: Boolean, override val access: AccessFlags ) : MemberBinarySignature { diff --git a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinMetadataVisibilities.kt b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinMetadataVisibilities.kt index 5ace3281235..b13629c6f9a 100644 --- a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinMetadataVisibilities.kt +++ b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinMetadataVisibilities.kt @@ -52,7 +52,7 @@ private fun visitFunction(flags: Flags, name: String, addMember: (MemberVisibili override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? { if (type != JvmFunctionExtensionVisitor.TYPE) return null return object : JvmFunctionExtensionVisitor() { - override fun visit(desc: JvmMemberSignature?) { + override fun visit(desc: JvmMethodSignature?) { jvmDesc = desc } } @@ -71,7 +71,7 @@ private fun visitConstructor(flags: Flags, addMember: (MemberVisibility) -> Unit override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor? { if (type != JvmConstructorExtensionVisitor.TYPE) return null return object : JvmConstructorExtensionVisitor() { - override fun visit(desc: JvmMemberSignature?) { + override fun visit(desc: JvmMethodSignature?) { jvmDesc = desc } } @@ -86,14 +86,14 @@ private fun visitConstructor(flags: Flags, addMember: (MemberVisibility) -> Unit private fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags, addMember: (MemberVisibility) -> Unit) = object : KmPropertyVisitor() { - var _fieldDesc: MemberSignature? = null - var _getterDesc: MemberSignature? = null - var _setterDesc: MemberSignature? = null + var _fieldDesc: JvmMemberSignature? = null + var _getterDesc: JvmMemberSignature? = null + var _setterDesc: JvmMemberSignature? = null override fun visitExtensions(type: KmExtensionType): KmPropertyExtensionVisitor? { if (type != JvmPropertyExtensionVisitor.TYPE) return null return object : JvmPropertyExtensionVisitor() { - override fun visit(fieldDesc: JvmMemberSignature?, getterDesc: JvmMemberSignature?, setterDesc: JvmMemberSignature?) { + override fun visit(fieldDesc: JvmFieldSignature?, getterDesc: JvmMethodSignature?, setterDesc: JvmMethodSignature?) { _fieldDesc = fieldDesc _getterDesc = getterDesc _setterDesc = setterDesc diff --git a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinVisibilities.kt b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinVisibilities.kt index 5d697c9868c..781f6ad5d7e 100644 --- a/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinVisibilities.kt +++ b/libraries/tools/binary-compatibility-validator/src/main/kotlin/org.jetbrains.kotlin.tools/kotlinVisibilities.kt @@ -7,11 +7,12 @@ package org.jetbrains.kotlin.tools import kotlinx.metadata.Flag import kotlinx.metadata.Flags +import kotlinx.metadata.jvm.JvmMemberSignature class ClassVisibility( val name: String, val flags: Flags?, - val members: Map, + val members: Map, val facadeClassName: String? = null ) { val visibility get() = flags @@ -21,12 +22,11 @@ class ClassVisibility( val partVisibilities = mutableListOf() } -fun ClassVisibility.findMember(signature: MemberSignature): MemberVisibility? = +fun ClassVisibility.findMember(signature: JvmMemberSignature): MemberVisibility? = members[signature] ?: partVisibilities.mapNotNull { it.members[signature] }.firstOrNull() -data class MemberVisibility(val member: MemberSignature, val visibility: Flags?) -typealias MemberSignature = kotlinx.metadata.jvm.JvmMemberSignature +data class MemberVisibility(val member: JvmMemberSignature, val visibility: Flags?) private fun isPublic(visibility: Flags?, isPublishedApi: Boolean) = visibility == null 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 bc2e7f4d0a4..25c5a5eb85e 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt @@ -42,7 +42,7 @@ private fun visitFunction(settings: KotlinpSettings, sb: StringBuilder, flags: F override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? { if (type != JvmFunctionExtensionVisitor.TYPE) return null return object : JvmFunctionExtensionVisitor() { - override fun visit(desc: JvmMemberSignature?) { + override fun visit(desc: JvmMethodSignature?) { jvmDesc = desc } @@ -114,13 +114,13 @@ private fun visitProperty( override fun visitExtensions(type: KmExtensionType): KmPropertyExtensionVisitor? { if (type != JvmPropertyExtensionVisitor.TYPE) return null return object : JvmPropertyExtensionVisitor() { - override fun visit(fieldDesc: JvmMemberSignature?, getterDesc: JvmMemberSignature?, setterDesc: JvmMemberSignature?) { + override fun visit(fieldDesc: JvmFieldSignature?, getterDesc: JvmMethodSignature?, setterDesc: JvmMethodSignature?) { jvmFieldDesc = fieldDesc jvmGetterDesc = getterDesc jvmSetterDesc = setterDesc } - override fun visitSyntheticMethodForAnnotations(desc: JvmMemberSignature?) { + override fun visitSyntheticMethodForAnnotations(desc: JvmMethodSignature?) { jvmSyntheticMethodForAnnotationsDesc = desc } } @@ -193,7 +193,7 @@ private fun visitConstructor(sb: StringBuilder, flags: Flags): KmConstructorVisi override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor? { if (type != JvmConstructorExtensionVisitor.TYPE) return null return object : JvmConstructorExtensionVisitor() { - override fun visit(desc: JvmMemberSignature?) { + override fun visit(desc: JvmMethodSignature?) { jvmDesc = desc } }