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) }