Pass whole ReadContext/WriteContext to kotlinx-metadata extensions

This commit is contained in:
Alexander Udalov
2018-06-13 14:51:17 +02:00
parent 05123c13f8
commit b00f765255
4 changed files with 67 additions and 71 deletions
@@ -6,41 +6,40 @@
package kotlinx.metadata.jvm.impl
import kotlinx.metadata.*
import kotlinx.metadata.impl.ReadContext
import kotlinx.metadata.impl.WriteContext
import kotlinx.metadata.impl.extensions.MetadataExtensions
import kotlinx.metadata.impl.readAnnotation
import kotlinx.metadata.impl.writeAnnotation
import kotlinx.metadata.jvm.*
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
import org.jetbrains.kotlin.metadata.deserialization.TypeTable
import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
import org.jetbrains.kotlin.metadata.serialization.StringTable
internal class JvmMetadataExtensions : MetadataExtensions {
override fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, strings: NameResolver, types: TypeTable) {
override fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext) {
val ext = v.visitExtensions(JvmClassExtensionVisitor.TYPE) as? JvmClassExtensionVisitor ?: return
val anonymousObjectOriginName = proto.getExtensionOrNull(JvmProtoBuf.anonymousObjectOriginName)
if (anonymousObjectOriginName != null) {
ext.visitAnonymousObjectOriginName(strings.getString(anonymousObjectOriginName))
ext.visitAnonymousObjectOriginName(c[anonymousObjectOriginName])
}
}
override fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, strings: NameResolver, types: TypeTable) {
override fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, c: ReadContext) {
val ext = v.visitExtensions(JvmFunctionExtensionVisitor.TYPE) as? JvmFunctionExtensionVisitor ?: return
ext.visit(JvmProtoBufUtil.getJvmMethodSignature(proto, strings, types)?.wrapAsPublic())
ext.visit(JvmProtoBufUtil.getJvmMethodSignature(proto, c.strings, c.types)?.wrapAsPublic())
val lambdaClassOriginName = proto.getExtensionOrNull(JvmProtoBuf.lambdaClassOriginName)
if (lambdaClassOriginName != null) {
ext.visitLambdaClassOriginName(strings.getString(lambdaClassOriginName))
ext.visitLambdaClassOriginName(c[lambdaClassOriginName])
}
}
override fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, strings: NameResolver, types: TypeTable) {
override fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, c: ReadContext) {
val ext = v.visitExtensions(JvmPropertyExtensionVisitor.TYPE) as? JvmPropertyExtensionVisitor ?: return
val fieldSignature = JvmProtoBufUtil.getJvmFieldSignature(proto, strings, types)
val fieldSignature = JvmProtoBufUtil.getJvmFieldSignature(proto, c.strings, c.types)
val propertySignature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature)
val getterSignature =
if (propertySignature != null && propertySignature.hasGetter()) propertySignature.getter else null
@@ -48,69 +47,67 @@ internal class JvmMetadataExtensions : MetadataExtensions {
if (propertySignature != null && propertySignature.hasSetter()) propertySignature.setter else null
ext.visit(
fieldSignature?.wrapAsPublic(),
getterSignature?.run { JvmMethodSignature(strings.getString(name), strings.getString(desc)) },
setterSignature?.run { JvmMethodSignature(strings.getString(name), strings.getString(desc)) }
getterSignature?.run { JvmMethodSignature(c[name], c[desc]) },
setterSignature?.run { JvmMethodSignature(c[name], c[desc]) }
)
val syntheticMethod =
if (propertySignature != null && propertySignature.hasSyntheticMethod()) propertySignature.syntheticMethod else null
ext.visitSyntheticMethodForAnnotations(syntheticMethod?.run { JvmMethodSignature(strings.getString(name), strings.getString(desc)) })
ext.visitSyntheticMethodForAnnotations(syntheticMethod?.run { JvmMethodSignature(c[name], c[desc]) })
ext.visitEnd()
}
override fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, strings: NameResolver, types: TypeTable) {
override fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, c: ReadContext) {
val ext = v.visitExtensions(JvmConstructorExtensionVisitor.TYPE) as? JvmConstructorExtensionVisitor ?: return
ext.visit(JvmProtoBufUtil.getJvmConstructorSignature(proto, strings, types)?.wrapAsPublic())
ext.visit(JvmProtoBufUtil.getJvmConstructorSignature(proto, c.strings, c.types)?.wrapAsPublic())
}
override fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, strings: NameResolver) {
override fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, c: ReadContext) {
val ext = v.visitExtensions(JvmTypeParameterExtensionVisitor.TYPE) as? JvmTypeParameterExtensionVisitor ?: return
for (annotation in proto.getExtension(JvmProtoBuf.typeParameterAnnotation)) {
ext.visitAnnotation(annotation.readAnnotation(strings))
ext.visitAnnotation(annotation.readAnnotation(c.strings))
}
ext.visitEnd()
}
override fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, strings: NameResolver) {
override fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext) {
val ext = v.visitExtensions(JvmTypeExtensionVisitor.TYPE) as? JvmTypeExtensionVisitor ?: return
ext.visit(proto.getExtension(JvmProtoBuf.isRaw))
for (annotation in proto.getExtension(JvmProtoBuf.typeAnnotation)) {
ext.visitAnnotation(annotation.readAnnotation(strings))
ext.visitAnnotation(annotation.readAnnotation(c.strings))
}
ext.visitEnd()
}
override fun writeClassExtensions(
type: KmExtensionType, proto: ProtoBuf.Class.Builder, strings: StringTable
): KmClassExtensionVisitor? {
override fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? {
if (type != JvmClassExtensionVisitor.TYPE) return null
return object : JvmClassExtensionVisitor() {
override fun visitAnonymousObjectOriginName(internalName: String) {
proto.setExtension(JvmProtoBuf.anonymousObjectOriginName, strings.getStringIndex(internalName))
proto.setExtension(JvmProtoBuf.anonymousObjectOriginName, c[internalName])
}
}
}
override fun writeFunctionExtensions(
type: KmExtensionType, proto: ProtoBuf.Function.Builder, strings: StringTable
type: KmExtensionType, proto: ProtoBuf.Function.Builder, c: WriteContext
): KmFunctionExtensionVisitor? {
if (type != JvmFunctionExtensionVisitor.TYPE) return null
return object : JvmFunctionExtensionVisitor() {
override fun visit(desc: JvmMethodSignature?) {
if (desc != null) {
proto.setExtension(JvmProtoBuf.methodSignature, desc.toJvmMethodSignature(strings))
proto.setExtension(JvmProtoBuf.methodSignature, desc.toJvmMethodSignature(c))
}
}
override fun visitLambdaClassOriginName(internalName: String) {
proto.setExtension(JvmProtoBuf.lambdaClassOriginName, strings.getStringIndex(internalName))
proto.setExtension(JvmProtoBuf.lambdaClassOriginName, c[internalName])
}
}
}
override fun writePropertyExtensions(
type: KmExtensionType, proto: ProtoBuf.Property.Builder, strings: StringTable
type: KmExtensionType, proto: ProtoBuf.Property.Builder, c: WriteContext
): KmPropertyExtensionVisitor? {
if (type != JvmPropertyExtensionVisitor.TYPE) return null
return object : JvmPropertyExtensionVisitor() {
@@ -125,15 +122,15 @@ internal class JvmMetadataExtensions : MetadataExtensions {
signature!!.apply {
if (fieldDesc != null) {
field = JvmProtoBuf.JvmFieldSignature.newBuilder().also { field ->
field.name = strings.getStringIndex(fieldDesc.name)
field.desc = strings.getStringIndex(fieldDesc.desc)
field.name = c[fieldDesc.name]
field.desc = c[fieldDesc.desc]
}.build()
}
if (getterDesc != null) {
getter = getterDesc.toJvmMethodSignature(strings)
getter = getterDesc.toJvmMethodSignature(c)
}
if (setterDesc != null) {
setter = setterDesc.toJvmMethodSignature(strings)
setter = setterDesc.toJvmMethodSignature(c)
}
}
}
@@ -145,7 +142,7 @@ internal class JvmMetadataExtensions : MetadataExtensions {
signature = JvmProtoBuf.JvmPropertySignature.newBuilder()
}
signature!!.syntheticMethod = desc.toJvmMethodSignature(strings)
signature!!.syntheticMethod = desc.toJvmMethodSignature(c)
}
override fun visitEnd() {
@@ -157,30 +154,30 @@ internal class JvmMetadataExtensions : MetadataExtensions {
}
override fun writeConstructorExtensions(
type: KmExtensionType, proto: ProtoBuf.Constructor.Builder, strings: StringTable
type: KmExtensionType, proto: ProtoBuf.Constructor.Builder, c: WriteContext
): KmConstructorExtensionVisitor? {
if (type != JvmConstructorExtensionVisitor.TYPE) return null
return object : JvmConstructorExtensionVisitor() {
override fun visit(desc: JvmMethodSignature?) {
if (desc != null) {
proto.setExtension(JvmProtoBuf.constructorSignature, desc.toJvmMethodSignature(strings))
proto.setExtension(JvmProtoBuf.constructorSignature, desc.toJvmMethodSignature(c))
}
}
}
}
override fun writeTypeParameterExtensions(
type: KmExtensionType, proto: ProtoBuf.TypeParameter.Builder, strings: StringTable
type: KmExtensionType, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext
): KmTypeParameterExtensionVisitor? {
if (type != JvmTypeParameterExtensionVisitor.TYPE) return null
return object : JvmTypeParameterExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(JvmProtoBuf.typeParameterAnnotation, annotation.writeAnnotation(strings).build())
proto.addExtension(JvmProtoBuf.typeParameterAnnotation, annotation.writeAnnotation(c.strings).build())
}
}
}
override fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, strings: StringTable): KmTypeExtensionVisitor? {
override fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor? {
if (type != JvmTypeExtensionVisitor.TYPE) return null
return object : JvmTypeExtensionVisitor() {
override fun visit(isRaw: Boolean) {
@@ -190,14 +187,14 @@ internal class JvmMetadataExtensions : MetadataExtensions {
}
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(JvmProtoBuf.typeAnnotation, annotation.writeAnnotation(strings).build())
proto.addExtension(JvmProtoBuf.typeAnnotation, annotation.writeAnnotation(c.strings).build())
}
}
}
private fun JvmMemberSignature.toJvmMethodSignature(strings: StringTable): JvmProtoBuf.JvmMethodSignature =
private fun JvmMemberSignature.toJvmMethodSignature(c: WriteContext): JvmProtoBuf.JvmMethodSignature =
JvmProtoBuf.JvmMethodSignature.newBuilder().apply {
name = strings.getStringIndex(this@toJvmMethodSignature.name)
desc = strings.getStringIndex(this@toJvmMethodSignature.desc)
name = c[this@toJvmMethodSignature.name]
desc = c[this@toJvmMethodSignature.desc]
}.build()
}
@@ -6,40 +6,39 @@
package kotlinx.metadata.impl.extensions
import kotlinx.metadata.*
import kotlinx.metadata.impl.ReadContext
import kotlinx.metadata.impl.WriteContext
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
import org.jetbrains.kotlin.metadata.deserialization.TypeTable
import org.jetbrains.kotlin.metadata.serialization.StringTable
import java.util.*
interface MetadataExtensions {
fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, strings: NameResolver, types: TypeTable)
fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext)
fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, strings: NameResolver, types: TypeTable)
fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, c: ReadContext)
fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, strings: NameResolver, types: TypeTable)
fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, c: ReadContext)
fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, strings: NameResolver, types: TypeTable)
fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, c: ReadContext)
fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, strings: NameResolver)
fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, c: ReadContext)
fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, strings: NameResolver)
fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext)
fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, strings: StringTable): KmClassExtensionVisitor?
fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor?
fun writeFunctionExtensions(type: KmExtensionType, proto: ProtoBuf.Function.Builder, strings: StringTable): KmFunctionExtensionVisitor?
fun writeFunctionExtensions(type: KmExtensionType, proto: ProtoBuf.Function.Builder, c: WriteContext): KmFunctionExtensionVisitor?
fun writePropertyExtensions(type: KmExtensionType, proto: ProtoBuf.Property.Builder, strings: StringTable): KmPropertyExtensionVisitor?
fun writePropertyExtensions(type: KmExtensionType, proto: ProtoBuf.Property.Builder, c: WriteContext): KmPropertyExtensionVisitor?
fun writeConstructorExtensions(
type: KmExtensionType, proto: ProtoBuf.Constructor.Builder, strings: StringTable
type: KmExtensionType, proto: ProtoBuf.Constructor.Builder, c: WriteContext
): KmConstructorExtensionVisitor?
fun writeTypeParameterExtensions(
type: KmExtensionType, proto: ProtoBuf.TypeParameter.Builder, strings: StringTable
type: KmExtensionType, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext
): KmTypeParameterExtensionVisitor?
fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, strings: StringTable): KmTypeExtensionVisitor?
fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor?
companion object {
val INSTANCES: List<MetadataExtensions> by lazy {
@@ -13,8 +13,8 @@ import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.metadata.deserialization.Flags as F
class ReadContext(
internal val strings: NameResolver,
internal val types: TypeTable,
val strings: NameResolver,
val types: TypeTable,
internal val versionRequirements: VersionRequirementTable,
private val parent: ReadContext? = null
) {
@@ -82,7 +82,7 @@ fun ProtoBuf.Class.accept(v: KmClassVisitor, strings: NameResolver) {
}
for (extension in c.extensions) {
extension.readClassExtensions(v, this, c.strings, c.types)
extension.readClassExtensions(v, this, c)
}
v.visitEnd()
@@ -142,7 +142,7 @@ private fun ProtoBuf.Constructor.accept(v: KmConstructorVisitor, c: ReadContext)
}
for (extension in c.extensions) {
extension.readConstructorExtensions(v, this, c.strings, c.types)
extension.readConstructorExtensions(v, this, c)
}
v.visitEnd()
@@ -176,7 +176,7 @@ private fun ProtoBuf.Function.accept(v: KmFunctionVisitor, outer: ReadContext) {
}
for (extension in c.extensions) {
extension.readFunctionExtensions(v, this, c.strings, c.types)
extension.readFunctionExtensions(v, this, c)
}
v.visitEnd()
@@ -207,7 +207,7 @@ private fun ProtoBuf.Property.accept(v: KmPropertyVisitor, outer: ReadContext) {
}
for (extension in c.extensions) {
extension.readPropertyExtensions(v, this, c.strings, c.types)
extension.readPropertyExtensions(v, this, c)
}
v.visitEnd()
@@ -270,7 +270,7 @@ private fun ProtoBuf.TypeParameter.accept(v: KmTypeParameterVisitor, c: ReadCont
}
for (extension in c.extensions) {
extension.readTypeParameterExtensions(v, this, c.strings)
extension.readTypeParameterExtensions(v, this, c)
}
v.visitEnd()
@@ -324,7 +324,7 @@ private fun ProtoBuf.Type.accept(v: KmTypeVisitor, c: ReadContext) {
}
for (extension in c.extensions) {
extension.readTypeExtensions(v, this, c.strings)
extension.readTypeExtensions(v, this, c)
}
v.visitEnd()
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTabl
import org.jetbrains.kotlin.metadata.serialization.StringTable
class WriteContext(val strings: StringTable) {
internal val extensions = MetadataExtensions.INSTANCES
private val extensions = MetadataExtensions.INSTANCES
val versionRequirements: MutableVersionRequirementTable = MutableVersionRequirementTable()
operator fun get(string: String): Int =
@@ -47,7 +47,7 @@ private fun writeTypeParameter(
override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor? =
c.applySingleExtension(type) {
writeTypeParameterExtensions(type, t, c.strings)
writeTypeParameterExtensions(type, t, c)
}
override fun visitEnd() {
@@ -116,7 +116,7 @@ private fun writeType(c: WriteContext, flags: Flags, output: (ProtoBuf.Type.Buil
override fun visitExtensions(type: KmExtensionType): KmTypeExtensionVisitor? =
c.applySingleExtension(type) {
writeTypeExtensions(type, t, c.strings)
writeTypeExtensions(type, t, c)
}
override fun visitEnd() {
@@ -143,7 +143,7 @@ private fun writeConstructor(c: WriteContext, flags: Flags, output: (ProtoBuf.Co
override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor? =
c.applySingleExtension(type) {
writeConstructorExtensions(type, t, c.strings)
writeConstructorExtensions(type, t, c)
}
override fun visitEnd() {
@@ -178,7 +178,7 @@ private fun writeFunction(c: WriteContext, flags: Flags, name: String, output: (
override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? =
c.applySingleExtension(type) {
writeFunctionExtensions(type, t, c.strings)
writeFunctionExtensions(type, t, c)
}
override fun visitEnd() {
@@ -212,7 +212,7 @@ private fun writeProperty(
override fun visitExtensions(type: KmExtensionType): KmPropertyExtensionVisitor? =
c.applySingleExtension(type) {
writePropertyExtensions(type, t, c.strings)
writePropertyExtensions(type, t, c)
}
override fun visitEnd() {
@@ -457,7 +457,7 @@ open class ClassWriter(stringTable: StringTable) : KmClassVisitor() {
override fun visitExtensions(type: KmExtensionType): KmClassExtensionVisitor? =
c.applySingleExtension(type) {
writeClassExtensions(type, t, c.strings)
writeClassExtensions(type, t, c)
}
override fun visitEnd() {