diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/inline/inlineUtil.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/inline/inlineUtil.kt index cd5ef8cba90..237aefd25e6 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/inline/inlineUtil.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/inline/inlineUtil.kt @@ -50,7 +50,7 @@ private fun inlineFunctionsJvmNames(functions: List, nameReso val typeTable = TypeTable(protoTypeTable) val inlineFunctions = functions.filter { Flags.IS_INLINE.get(it.flags) } val jvmNames = inlineFunctions.mapNotNull { - JvmProtoBufUtil.getJvmMethodSignature(it, nameResolver, typeTable)?.toString() + JvmProtoBufUtil.getJvmMethodSignature(it, nameResolver, typeTable)?.asString() } return jvmNames.toSet() } 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 d9bc4596480..8817bfef43f 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 @@ -40,9 +40,9 @@ data class MemberSignature private constructor(internal val signature: String) { } @JvmStatic - fun fromJvmMemberSignature(signature: JvmMemberSignature): MemberSignature = when { - signature.isField -> fromFieldNameAndDesc(signature.name, signature.desc) - else -> fromMethodNameAndDesc(signature.name, signature.desc) + fun fromJvmMemberSignature(signature: JvmMemberSignature): MemberSignature = when (signature) { + is JvmMemberSignature.Method -> fromMethodNameAndDesc(signature.name, signature.desc) + is JvmMemberSignature.Field -> fromFieldNameAndDesc(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 281fdc56fec..7d61b6d3917 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 @@ -5,17 +5,25 @@ package org.jetbrains.kotlin.metadata.jvm.deserialization -data class JvmMemberSignature(val name: String, val desc: String) { +/** + * A signature of 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;` + */ +sealed class JvmMemberSignature { - /** - * Returns `true` when this signature represents a field. - */ - val isField: Boolean = desc.indexOf(")") < 0 + abstract val name: String + abstract val desc: String - /** - * Returns `true` when this signature represents a method. - */ - val isMethod: Boolean get() = !isField + data class Method(override val name: String, override val desc: String) : JvmMemberSignature() { + override fun asString() = name + desc + } - override fun toString() = if (isField) name + ":" + desc else name + desc + data class Field(override val name: String, override val desc: String) : JvmMemberSignature() { + override fun asString() = name + ":" + desc + } + + final override fun toString() = asString() + abstract fun asString(): String } \ No newline at end of file diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt index 32fb5f4bb67..24e6a81ef14 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt @@ -64,7 +64,7 @@ object JvmProtoBufUtil { proto: ProtoBuf.Function, nameResolver: NameResolver, typeTable: TypeTable - ): JvmMemberSignature? { + ): JvmMemberSignature.Method? { 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 JvmMemberSignature(nameResolver.getString(name), desc) + return JvmMemberSignature.Method(nameResolver.getString(name), desc) } fun getJvmConstructorSignature( proto: ProtoBuf.Constructor, nameResolver: NameResolver, typeTable: TypeTable - ): JvmMemberSignature? { + ): JvmMemberSignature.Method? { 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 JvmMemberSignature("", desc) + return JvmMemberSignature.Method("", desc) } fun getJvmFieldSignature( proto: ProtoBuf.Property, nameResolver: NameResolver, typeTable: TypeTable - ): JvmMemberSignature? { + ): JvmMemberSignature.Field? { val signature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature) ?: return null val field = if (signature.hasField()) signature.field else null @@ -112,7 +112,7 @@ object JvmProtoBufUtil { if (field != null && field.hasDesc()) nameResolver.getString(field.desc) else mapTypeDefault(proto.returnType(typeTable), nameResolver) ?: return null - return JvmMemberSignature(nameResolver.getString(name), desc) + return JvmMemberSignature.Field(nameResolver.getString(name), desc) } 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 30f84ae7eef..f299ceac082 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt @@ -53,13 +53,8 @@ import kotlin.reflect.jvm.internal.structure.* internal sealed class JvmFunctionSignature { abstract fun asString(): String - class KotlinFunction(val signature: JvmMemberSignature) : JvmFunctionSignature() { - private val _signature = signature.toString() - - init { - require(signature.isMethod) - } - + class KotlinFunction(val signature: JvmMemberSignature.Method) : JvmFunctionSignature() { + private val _signature = signature.asString() val methodName: String get() = signature.name val methodDesc: String get() = signature.desc @@ -67,12 +62,8 @@ internal sealed class JvmFunctionSignature { override fun asString(): String = _signature } - class KotlinConstructor(val signature: JvmMemberSignature) : JvmFunctionSignature() { - private val _signature = signature.toString() - - init { - require(signature.isMethod) - } + class KotlinConstructor(val signature: JvmMemberSignature.Method) : JvmFunctionSignature() { + private val _signature = signature.asString() val constructorDesc: String get() = signature.desc 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 647d5a6c3a9..c5713facaf9 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 @@ -168,7 +168,7 @@ private object ByJvmSignatureIndexer : DecompiledTextIndexer= 0 + data class Method(override val name: String, override val desc: String) : JvmMemberSignature() { + override fun asString() = name + desc + } - override fun toString() = if (isField) name + ":" + desc else name + desc + data class Field(override val name: String, override val desc: String) : JvmMemberSignature() { + override fun asString() = name + ":" + desc + } + + final override fun toString() = asString() + abstract fun asString(): String } -internal fun org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature.wrapAsPublic() = JvmMemberSignature(name, desc) \ No newline at end of file +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 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 e1bd0b93c31..d3003feeecc 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(strings.getString(name), strings.getString(desc)) }, - setterSignature?.run { JvmMemberSignature(strings.getString(name), strings.getString(desc)) } + getterSignature?.run { JvmMemberSignature.Method(strings.getString(name), strings.getString(desc)) }, + setterSignature?.run { JvmMemberSignature.Method(strings.getString(name), strings.getString(desc)) } ) val syntheticMethod = if (propertySignature != null && propertySignature.hasSyntheticMethod()) propertySignature.syntheticMethod else null - ext.visitSyntheticMethodForAnnotations(syntheticMethod?.run { JvmMemberSignature(strings.getString(name), strings.getString(desc)) }) + ext.visitSyntheticMethodForAnnotations(syntheticMethod?.run { JvmMemberSignature.Method(strings.getString(name), strings.getString(desc)) }) ext.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 26b3f61ccd4..439d41df985 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 @@ -9,6 +9,7 @@ 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] @@ -43,8 +44,8 @@ fun getBinaryAPI(classStreams: Sequence, visibilityFilter: (String) val supertypes = listOf(superName) - "java/lang/Object" + interfaces.sorted() val memberSignatures = ( - fields.map { with(it) { FieldBinarySignature(name, desc, isPublishedApi(), AccessFlags(access)) } } + - methods.map { with(it) { MethodBinarySignature(name, desc, isPublishedApi(), AccessFlags(access)) } } + fields.map { with(it) { FieldBinarySignature(MemberSignature.Field(name, desc), isPublishedApi(), AccessFlags(access)) } } + + methods.map { with(it) { MethodBinarySignature(MemberSignature.Method(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 746356170fc..00fb7cff340 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 @@ -9,6 +9,7 @@ import kotlinx.metadata.jvm.KotlinClassMetadata 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", @@ -38,8 +39,9 @@ data class ClassBinarySignature( interface MemberBinarySignature { - val name: String - val desc: String + val jvmMember: MemberSignature + val name: String get() = jvmMember.name + val desc: String get() = jvmMember.desc val access: AccessFlags val isPublishedApi: Boolean @@ -48,15 +50,14 @@ interface MemberBinarySignature { && (findMemberVisibility(classVisibility)?.isPublic(isPublishedApi) ?: true) fun findMemberVisibility(classVisibility: ClassVisibility?): MemberVisibility? { - return classVisibility?.findMember(MemberSignature(name, desc)) + return classVisibility?.findMember(jvmMember) } val signature: String } data class MethodBinarySignature( - override val name: String, - override val desc: String, + override val jvmMember: MemberSignature, override val isPublishedApi: Boolean, override val access: AccessFlags ) : MemberBinarySignature { @@ -87,17 +88,16 @@ data class MethodBinarySignature( return when { !access.isSynthetic -> null name == "" && "ILkotlin/jvm/internal/DefaultConstructorMarker;" in desc -> - MemberSignature(name, desc.replace("ILkotlin/jvm/internal/DefaultConstructorMarker;", "")) + MemberSignature.Method(name, desc.replace("ILkotlin/jvm/internal/DefaultConstructorMarker;", "")) name.endsWith("\$default") && "ILjava/lang/Object;)" in desc -> - MemberSignature(name.removeSuffix("\$default"), desc.replace("ILjava/lang/Object;)", ")").replace("(L$className;", "(")) + MemberSignature.Method(name.removeSuffix("\$default"), desc.replace("ILjava/lang/Object;)", ")").replace("(L$className;", "(")) else -> null } } } data class FieldBinarySignature( - override val name: String, - override val desc: String, + override val jvmMember: MemberSignature, override val isPublishedApi: Boolean, override val access: AccessFlags ) : MemberBinarySignature {