Introduce JvmMemberSignature to represent name and desc of jvm methods and fields

Return member name and desc in a class in order not to parse that information
from concatenated string when required.
This commit is contained in:
Ilya Gorbunov
2018-05-27 18:14:16 +03:00
parent eee9f8ab3f
commit 36c658fd8b
12 changed files with 91 additions and 77 deletions
@@ -45,17 +45,14 @@ private val VISIBILITY_FLAGS_MAP = mapOf(
)
private fun Flags.toVisibility() = VISIBILITY_FLAGS_MAP.entries.firstOrNull { (modifier) -> modifier(this) }?.value
private fun String.toMemberSignature() = indexOf("(").let { i ->
if (i < 0) MemberSignature("", this) else MemberSignature(substring(0, i), substring(i))
}
private fun visitFunction(flags: Flags, name: String, addMember: (MemberVisibility) -> Unit) =
object : KmFunctionVisitor() {
var jvmDesc: String? = null
var jvmDesc: JvmMemberSignature? = null
override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? {
if (type != JvmFunctionExtensionVisitor.TYPE) return null
return object : JvmFunctionExtensionVisitor() {
override fun visit(desc: String?) {
override fun visit(desc: JvmMemberSignature?) {
jvmDesc = desc
}
}
@@ -63,25 +60,25 @@ private fun visitFunction(flags: Flags, name: String, addMember: (MemberVisibili
override fun visitEnd() {
jvmDesc?.let { jvmDesc ->
addMember(MemberVisibility(jvmDesc.toMemberSignature(), flags))
addMember(MemberVisibility(jvmDesc, flags))
}
}
}
private fun visitConstructor(flags: Flags, addMember: (MemberVisibility) -> Unit) =
object : KmConstructorVisitor() {
var jvmDesc: String? = null
var jvmDesc: JvmMemberSignature? = null
override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor? {
if (type != JvmConstructorExtensionVisitor.TYPE) return null
return object : JvmConstructorExtensionVisitor() {
override fun visit(desc: String?) {
override fun visit(desc: JvmMemberSignature?) {
jvmDesc = desc
}
}
}
override fun visitEnd() {
jvmDesc?.toMemberSignature()?.let { signature ->
jvmDesc?.let { signature ->
addMember(MemberVisibility(signature, flags))
}
}
@@ -89,19 +86,17 @@ 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 _fieldDesc: MemberSignature? = null
var _getterDesc: MemberSignature? = null
var _setterDesc: MemberSignature? = null
override fun visitExtensions(type: KmExtensionType): KmPropertyExtensionVisitor? {
if (type != JvmPropertyExtensionVisitor.TYPE) return null
return object : JvmPropertyExtensionVisitor() {
override fun visit(fieldName: String?, fieldTypeDesc: String?, getterDesc: String?, setterDesc: String?) {
if (fieldName != null && fieldTypeDesc != null)
fieldDesc = MemberSignature(fieldName, fieldTypeDesc)
_getterDesc = getterDesc?.toMemberSignature()
_setterDesc = setterDesc?.toMemberSignature()
override fun visit(fieldDesc: JvmMemberSignature?, getterDesc: JvmMemberSignature?, setterDesc: JvmMemberSignature?) {
_fieldDesc = fieldDesc
_getterDesc = getterDesc
_setterDesc = setterDesc
}
}
}
@@ -109,7 +104,7 @@ private fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setter
override fun visitEnd() {
_getterDesc?.let { addMember(MemberVisibility(it, getterFlags)) }
_setterDesc?.let { addMember(MemberVisibility(it, setterFlags)) }
fieldDesc?.let {
_fieldDesc?.let {
val fieldVisibility = when {
Flag.Property.IS_LATEINIT(flags) -> setterFlags
_getterDesc == null && _setterDesc == null -> flags // JvmField or const case
@@ -26,7 +26,7 @@ fun ClassVisibility.findMember(signature: MemberSignature): MemberVisibility? =
data class MemberVisibility(val member: MemberSignature, val visibility: Flags?)
data class MemberSignature(val name: String, val desc: String)
typealias MemberSignature = kotlinx.metadata.jvm.JvmMemberSignature
private fun isPublic(visibility: Flags?, isPublishedApi: Boolean) =
visibility == null