From 52a9cc06e0016a92e87104cbc32e8f9932bb4f7f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 23 Mar 2018 21:20:47 +0100 Subject: [PATCH] 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) --- .../src/org/jetbrains/kotlin/codegen/AsmUtil.java | 7 ++++--- .../codegen/inline/AnonymousObjectTransformer.kt | 2 +- .../kotlin/serialization/DescriptorSerializer.kt | 11 ----------- .../kotlin/serialization/StringTableImpl.kt | 7 ------- .../metadata/jvm/deserialization/JvmProtoBufUtil.kt | 13 +++++++++++++ .../metadata/jvm/serialization/JvmStringTable.kt | 2 +- .../kotlin/metadata/serialization/StringTable.kt | 4 ---- 7 files changed, 19 insertions(+), 27 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 7306dd612dc..f9358b79b25 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -9,6 +9,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import com.intellij.openapi.util.Pair; import com.intellij.psi.tree.IElementType; +import com.intellij.util.ArrayUtil; import kotlin.Unit; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,7 +26,7 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.load.java.JavaVisibilities; 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.name.ClassId; import org.jetbrains.kotlin.name.FqName; @@ -891,11 +892,11 @@ public class AsmUtil { public static void writeAnnotationData( @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( - @NotNull AnnotationVisitor av, @NotNull String[] data, @NotNull List strings + @NotNull AnnotationVisitor av, @NotNull String[] data, @NotNull String[] strings ) { AnnotationVisitor dataVisitor = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME); for (String string : data) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt index 0453ebb96a8..16a4751de38 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt @@ -228,7 +228,7 @@ class AnonymousObjectTransformer( val data = header.data val strings = header.strings if (data != null && strings != null) { - AsmUtil.writeAnnotationData(av, data, strings.asList()) + AsmUtil.writeAnnotationData(av, data, strings) } return@action } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index d85e9b0f0e7..014e929fcd5 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -17,10 +17,8 @@ import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement import org.jetbrains.kotlin.metadata.serialization.Interner import org.jetbrains.kotlin.metadata.serialization.MutableTypeTable 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.Name -import org.jetbrains.kotlin.protobuf.MessageLite import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry 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.types.* import org.jetbrains.kotlin.types.typeUtil.contains -import java.io.ByteArrayOutputStream import java.util.* class DescriptorSerializer private constructor( @@ -759,14 +756,6 @@ class DescriptorSerializer private constructor( 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) { Variance.INVARIANT -> ProtoBuf.TypeParameter.Variance.INV Variance.IN_VARIANCE -> ProtoBuf.TypeParameter.Variance.IN diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/StringTableImpl.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/StringTableImpl.kt index 43f6153c5bd..6fa250e85f4 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/StringTableImpl.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/StringTableImpl.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.metadata.ProtoBuf.QualifiedNameTable.QualifiedName import org.jetbrains.kotlin.metadata.serialization.Interner import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName -import java.io.OutputStream open class StringTableImpl : DescriptorAwareStringTable { private class FqNameProto(val fqName: QualifiedName.Builder) { @@ -90,10 +89,4 @@ open class StringTableImpl : DescriptorAwareStringTable { return Pair(strings.build(), qualifiedNames.build()) } - - override fun serializeTo(output: OutputStream) { - val (strings, qualifiedNames) = buildProto() - strings.writeDelimitedTo(output) - qualifiedNames.writeDelimitedTo(output) - } } diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt index 11824296862..0683ad325f4 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt @@ -8,8 +8,11 @@ package org.jetbrains.kotlin.metadata.jvm.deserialization import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.* 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.MessageLite import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream import java.io.InputStream object JvmProtoBufUtil { @@ -46,6 +49,16 @@ object JvmProtoBufUtil { private fun InputStream.readNameResolver(strings: Array): JvmNameResolver = 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 = + BitEncoding.encodeBytes(ByteArrayOutputStream().apply { + stringTable.serializeTo(this) + message.writeTo(this) + }.toByteArray()) + // returns JVM signature in the format: "equals(Ljava/lang/Object;)Z" fun getJvmMethodSignature( proto: ProtoBuf.Function, diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/serialization/JvmStringTable.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/serialization/JvmStringTable.kt index ee207e51ef8..d1ef55194c4 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/serialization/JvmStringTable.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/serialization/JvmStringTable.kt @@ -94,7 +94,7 @@ open class JvmStringTable(nameResolver: JvmNameResolver? = null) : StringTable { return index } - override fun serializeTo(output: OutputStream) { + fun serializeTo(output: OutputStream) { with(JvmProtoBuf.StringTableTypes.newBuilder()) { addAllRecord(records.map { it.build() }) addAllLocalName(localNames) diff --git a/core/metadata/src/org/jetbrains/kotlin/metadata/serialization/StringTable.kt b/core/metadata/src/org/jetbrains/kotlin/metadata/serialization/StringTable.kt index d1a42df393d..62abd3fafed 100644 --- a/core/metadata/src/org/jetbrains/kotlin/metadata/serialization/StringTable.kt +++ b/core/metadata/src/org/jetbrains/kotlin/metadata/serialization/StringTable.kt @@ -5,8 +5,6 @@ package org.jetbrains.kotlin.metadata.serialization -import java.io.OutputStream - interface StringTable { 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` */ fun getQualifiedClassNameIndex(className: String, isLocal: Boolean): Int - - fun serializeTo(output: OutputStream) }