Extract subclasses of JvmMemberSignature sealed class to top-level
Use more specific subtypes of sealed class in visitors.
This commit is contained in:
+4
-3
@@ -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<String>) {
|
||||
val src = args[0]
|
||||
@@ -44,8 +45,8 @@ fun getBinaryAPI(classStreams: Sequence<InputStream>, 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)
|
||||
}
|
||||
|
||||
+10
-8
@@ -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 == "<init>" && "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 {
|
||||
|
||||
+6
-6
@@ -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
|
||||
|
||||
+4
-4
@@ -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<MemberSignature, MemberVisibility>,
|
||||
val members: Map<JvmMemberSignature, MemberVisibility>,
|
||||
val facadeClassName: String? = null
|
||||
) {
|
||||
val visibility get() = flags
|
||||
@@ -21,12 +22,11 @@ class ClassVisibility(
|
||||
val partVisibilities = mutableListOf<ClassVisibility>()
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user