Remove StringTable.serializeTo, add JvmProtoBufUtil.writeData

StringTable.serializeTo was effectively only used for JvmStringTable,
but was declared in StringTable because of the usage in
DescriptorSerializer.serialize (which, in turn, was only used from JVM
codegen)
This commit is contained in:
Alexander Udalov
2018-03-23 21:20:47 +01:00
parent 58b7643065
commit 52a9cc06e0
7 changed files with 19 additions and 27 deletions
@@ -9,6 +9,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Pair;
import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.IElementType;
import com.intellij.util.ArrayUtil;
import kotlin.Unit; import kotlin.Unit;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -25,7 +26,7 @@ import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.load.java.JavaVisibilities; import org.jetbrains.kotlin.load.java.JavaVisibilities;
import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.load.java.JvmAnnotationNames;
import org.jetbrains.kotlin.metadata.jvm.deserialization.BitEncoding; import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil;
import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable; import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable;
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
@@ -891,11 +892,11 @@ public class AsmUtil {
public static void writeAnnotationData( public static void writeAnnotationData(
@NotNull AnnotationVisitor av, @NotNull MessageLite message, @NotNull JvmStringTable stringTable @NotNull AnnotationVisitor av, @NotNull MessageLite message, @NotNull JvmStringTable stringTable
) { ) {
writeAnnotationData(av, BitEncoding.encodeBytes(DescriptorSerializer.serialize(message, stringTable)), stringTable.getStrings()); writeAnnotationData(av, JvmProtoBufUtil.writeData(message, stringTable), ArrayUtil.toStringArray(stringTable.getStrings()));
} }
public static void writeAnnotationData( public static void writeAnnotationData(
@NotNull AnnotationVisitor av, @NotNull String[] data, @NotNull List<String> strings @NotNull AnnotationVisitor av, @NotNull String[] data, @NotNull String[] strings
) { ) {
AnnotationVisitor dataVisitor = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME); AnnotationVisitor dataVisitor = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME);
for (String string : data) { for (String string : data) {
@@ -228,7 +228,7 @@ class AnonymousObjectTransformer(
val data = header.data val data = header.data
val strings = header.strings val strings = header.strings
if (data != null && strings != null) { if (data != null && strings != null) {
AsmUtil.writeAnnotationData(av, data, strings.asList()) AsmUtil.writeAnnotationData(av, data, strings)
} }
return@action return@action
} }
@@ -17,10 +17,8 @@ import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement
import org.jetbrains.kotlin.metadata.serialization.Interner import org.jetbrains.kotlin.metadata.serialization.Interner
import org.jetbrains.kotlin.metadata.serialization.MutableTypeTable import org.jetbrains.kotlin.metadata.serialization.MutableTypeTable
import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable
import org.jetbrains.kotlin.metadata.serialization.StringTable
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry
import org.jetbrains.kotlin.resolve.DescriptorUtils.isInterface import org.jetbrains.kotlin.resolve.DescriptorUtils.isInterface
@@ -38,7 +36,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.nonSourceAnnotations
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.typeUtil.contains import org.jetbrains.kotlin.types.typeUtil.contains
import java.io.ByteArrayOutputStream
import java.util.* import java.util.*
class DescriptorSerializer private constructor( class DescriptorSerializer private constructor(
@@ -759,14 +756,6 @@ class DescriptorSerializer private constructor(
return serializer return serializer
} }
@JvmStatic
fun serialize(message: MessageLite, stringTable: StringTable): ByteArray {
return ByteArrayOutputStream().apply {
stringTable.serializeTo(this)
message.writeTo(this)
}.toByteArray()
}
private fun variance(variance: Variance): ProtoBuf.TypeParameter.Variance = when (variance) { private fun variance(variance: Variance): ProtoBuf.TypeParameter.Variance = when (variance) {
Variance.INVARIANT -> ProtoBuf.TypeParameter.Variance.INV Variance.INVARIANT -> ProtoBuf.TypeParameter.Variance.INV
Variance.IN_VARIANCE -> ProtoBuf.TypeParameter.Variance.IN Variance.IN_VARIANCE -> ProtoBuf.TypeParameter.Variance.IN
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.metadata.ProtoBuf.QualifiedNameTable.QualifiedName
import org.jetbrains.kotlin.metadata.serialization.Interner import org.jetbrains.kotlin.metadata.serialization.Interner
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import java.io.OutputStream
open class StringTableImpl : DescriptorAwareStringTable { open class StringTableImpl : DescriptorAwareStringTable {
private class FqNameProto(val fqName: QualifiedName.Builder) { private class FqNameProto(val fqName: QualifiedName.Builder) {
@@ -90,10 +89,4 @@ open class StringTableImpl : DescriptorAwareStringTable {
return Pair(strings.build(), qualifiedNames.build()) return Pair(strings.build(), qualifiedNames.build())
} }
override fun serializeTo(output: OutputStream) {
val (strings, qualifiedNames) = buildProto()
strings.writeDelimitedTo(output)
qualifiedNames.writeDelimitedTo(output)
}
} }
@@ -8,8 +8,11 @@ package org.jetbrains.kotlin.metadata.jvm.deserialization
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.* import org.jetbrains.kotlin.metadata.deserialization.*
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
import org.jetbrains.kotlin.protobuf.MessageLite
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.InputStream import java.io.InputStream
object JvmProtoBufUtil { object JvmProtoBufUtil {
@@ -46,6 +49,16 @@ object JvmProtoBufUtil {
private fun InputStream.readNameResolver(strings: Array<String>): JvmNameResolver = private fun InputStream.readNameResolver(strings: Array<String>): JvmNameResolver =
JvmNameResolver(JvmProtoBuf.StringTableTypes.parseDelimitedFrom(this, EXTENSION_REGISTRY), strings) JvmNameResolver(JvmProtoBuf.StringTableTypes.parseDelimitedFrom(this, EXTENSION_REGISTRY), strings)
/**
* Serializes [message] and [stringTable] into a string array which must be further written to [Metadata.d1]
*/
@JvmStatic
fun writeData(message: MessageLite, stringTable: JvmStringTable): Array<String> =
BitEncoding.encodeBytes(ByteArrayOutputStream().apply {
stringTable.serializeTo(this)
message.writeTo(this)
}.toByteArray())
// returns JVM signature in the format: "equals(Ljava/lang/Object;)Z" // returns JVM signature in the format: "equals(Ljava/lang/Object;)Z"
fun getJvmMethodSignature( fun getJvmMethodSignature(
proto: ProtoBuf.Function, proto: ProtoBuf.Function,
@@ -94,7 +94,7 @@ open class JvmStringTable(nameResolver: JvmNameResolver? = null) : StringTable {
return index return index
} }
override fun serializeTo(output: OutputStream) { fun serializeTo(output: OutputStream) {
with(JvmProtoBuf.StringTableTypes.newBuilder()) { with(JvmProtoBuf.StringTableTypes.newBuilder()) {
addAllRecord(records.map { it.build() }) addAllRecord(records.map { it.build() })
addAllLocalName(localNames) addAllLocalName(localNames)
@@ -5,8 +5,6 @@
package org.jetbrains.kotlin.metadata.serialization package org.jetbrains.kotlin.metadata.serialization
import java.io.OutputStream
interface StringTable { interface StringTable {
fun getStringIndex(string: String): Int fun getStringIndex(string: String): Int
@@ -14,6 +12,4 @@ interface StringTable {
* @param className the fully qualified name of some class in the format: `org/foo/bar/Test.Inner` * @param className the fully qualified name of some class in the format: `org/foo/bar/Test.Inner`
*/ */
fun getQualifiedClassNameIndex(className: String, isLocal: Boolean): Int fun getQualifiedClassNameIndex(className: String, isLocal: Boolean): Int
fun serializeTo(output: OutputStream)
} }