Refactor: make JvmMemberSignature a sealed class

Use JvmMemberSignature.asString instead of toString
This commit is contained in:
Ilya Gorbunov
2018-05-29 06:50:26 +03:00
parent 2f58539200
commit 1a290d0c73
10 changed files with 65 additions and 59 deletions
@@ -4,6 +4,7 @@
*/
package kotlinx.metadata.jvm
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature as JvmMemberSignatureImpl
/**
* A signature of JVM method or field
@@ -11,19 +12,24 @@ package kotlinx.metadata.jvm
* @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;`
*/
data class JvmMemberSignature(val name: String, val desc: String) {
sealed class JvmMemberSignature {
/**
* Returns `true` when this signature represents a field.
*/
val isField: Boolean get() = desc.indexOf("(") < 0
abstract val name: String
abstract val desc: String
/**
* Returns `true` when this signature represents a method.
*/
val isMethod: Boolean get() = desc.indexOf("(") >= 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)
internal fun JvmMemberSignatureImpl.wrapAsPublic() = when (this) {
is JvmMemberSignatureImpl.Method -> JvmMemberSignature.Method(name, desc)
is JvmMemberSignatureImpl.Field -> JvmMemberSignature.Field(name, desc)
}
@@ -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()
}
@@ -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<String>) {
val src = args[0]
@@ -43,8 +44,8 @@ fun getBinaryAPI(classStreams: Sequence<InputStream>, 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)
}
@@ -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 == "<init>" && "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 {