kotlinx-metadata-jvm: deprecate KotlinClassHeader.bytecodeVersion

#KT-41758
This commit is contained in:
Alexander Udalov
2021-01-22 14:08:07 +01:00
parent c6f5ce6837
commit 448c6c2f0d
5 changed files with 38 additions and 22 deletions
@@ -1,5 +1,10 @@
# kotlinx-metadata-jvm # kotlinx-metadata-jvm
## 0.2.1
- Deprecate `KotlinClassHeader.bytecodeVersion` and `KotlinClassHeader`'s constructor that takes a bytecode version array.
Related to ['KT-41758`](https://youtrack.jetbrains.com/issue/KT-41758).
## 0.2.0 ## 0.2.0
- ['KT-41011`](https://youtrack.jetbrains.com/issue/KT-41011) Using KotlinClassMetadata.Class.Writer with metadata version < 1.4 will write incorrect version requirement table - ['KT-41011`](https://youtrack.jetbrains.com/issue/KT-41011) Using KotlinClassMetadata.Class.Writer with metadata version < 1.4 will write incorrect version requirement table
@@ -23,7 +23,13 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
* @param packageName see [packageName] * @param packageName see [packageName]
* @param extraInt see [extraInt] * @param extraInt see [extraInt]
*/ */
class KotlinClassHeader( class KotlinClassHeader
@Deprecated(
"Use another constructor, which doesn't take bytecodeVersion as a parameter.",
ReplaceWith("KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt)"),
DeprecationLevel.ERROR
)
constructor(
kind: Int?, kind: Int?,
metadataVersion: IntArray?, metadataVersion: IntArray?,
bytecodeVersion: IntArray?, bytecodeVersion: IntArray?,
@@ -33,6 +39,17 @@ class KotlinClassHeader(
packageName: String?, packageName: String?,
extraInt: Int? extraInt: Int?
) { ) {
@Suppress("DEPRECATION_ERROR")
constructor(
kind: Int?,
metadataVersion: IntArray?,
data1: Array<String>?,
data2: Array<String>?,
extraString: String?,
packageName: String?,
extraInt: Int?
) : this(kind, metadataVersion, null, data1, data2, extraString, packageName, extraInt)
/** /**
* A kind of the metadata this header encodes. * A kind of the metadata this header encodes.
* *
@@ -59,6 +76,10 @@ class KotlinClassHeader(
* @see Metadata.bytecodeVersion * @see Metadata.bytecodeVersion
* @see COMPATIBLE_BYTECODE_VERSION * @see COMPATIBLE_BYTECODE_VERSION
*/ */
@Deprecated(
"Bytecode version had no significant use in Kotlin metadata and it will be removed in a future version.",
level = DeprecationLevel.ERROR
)
val bytecodeVersion: IntArray = bytecodeVersion ?: intArrayOf() val bytecodeVersion: IntArray = bytecodeVersion ?: intArrayOf()
/** /**
@@ -149,6 +170,10 @@ class KotlinClassHeader(
* *
* @see bytecodeVersion * @see bytecodeVersion
*/ */
@Deprecated(
"Bytecode version had no significant use in Kotlin metadata and it will be removed in a future version.",
level = DeprecationLevel.ERROR
)
@JvmField @JvmField
val COMPATIBLE_BYTECODE_VERSION = JvmBytecodeBinaryVersion.INSTANCE.toArray().copyOf() val COMPATIBLE_BYTECODE_VERSION = JvmBytecodeBinaryVersion.INSTANCE.toArray().copyOf()
} }
@@ -68,10 +68,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
): Class { ): Class {
checkMetadataVersion(metadataVersion) checkMetadataVersion(metadataVersion)
val (d1, d2) = writeProtoBufData(t.build(), c) val (d1, d2) = writeProtoBufData(t.build(), c)
val metadata = KotlinClassHeader( val metadata = KotlinClassHeader(KotlinClassHeader.CLASS_KIND, metadataVersion, d1, d2, null, null, extraInt)
KotlinClassHeader.CLASS_KIND, metadataVersion, KotlinClassHeader.COMPATIBLE_BYTECODE_VERSION,
d1, d2, null, null, extraInt
)
return Class(metadata) return Class(metadata)
} }
} }
@@ -122,10 +119,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
): FileFacade { ): FileFacade {
checkMetadataVersion(metadataVersion) checkMetadataVersion(metadataVersion)
val (d1, d2) = writeProtoBufData(t.build(), c) val (d1, d2) = writeProtoBufData(t.build(), c)
val metadata = KotlinClassHeader( val metadata = KotlinClassHeader(KotlinClassHeader.FILE_FACADE_KIND, metadataVersion, d1, d2, null, null, extraInt)
KotlinClassHeader.FILE_FACADE_KIND, metadataVersion, KotlinClassHeader.COMPATIBLE_BYTECODE_VERSION,
d1, d2, null, null, extraInt
)
return FileFacade(metadata) return FileFacade(metadata)
} }
} }
@@ -197,10 +191,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
val (d1, d2) = val (d1, d2) =
if (proto != null) writeProtoBufData(proto, c) if (proto != null) writeProtoBufData(proto, c)
else Pair(emptyArray(), emptyArray()) else Pair(emptyArray(), emptyArray())
val metadata = KotlinClassHeader( val metadata = KotlinClassHeader(KotlinClassHeader.SYNTHETIC_CLASS_KIND, metadataVersion, d1, d2, null, null, extraInt)
KotlinClassHeader.SYNTHETIC_CLASS_KIND, metadataVersion, KotlinClassHeader.COMPATIBLE_BYTECODE_VERSION,
d1, d2, null, null, extraInt
)
return SyntheticClass(metadata) return SyntheticClass(metadata)
} }
} }
@@ -238,7 +229,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
): MultiFileClassFacade { ): MultiFileClassFacade {
checkMetadataVersion(metadataVersion) checkMetadataVersion(metadataVersion)
val metadata = KotlinClassHeader( val metadata = KotlinClassHeader(
KotlinClassHeader.MULTI_FILE_CLASS_FACADE_KIND, metadataVersion, KotlinClassHeader.COMPATIBLE_BYTECODE_VERSION, KotlinClassHeader.MULTI_FILE_CLASS_FACADE_KIND, metadataVersion,
partClassNames.toTypedArray(), null, null, null, extraInt partClassNames.toTypedArray(), null, null, null, extraInt
) )
return MultiFileClassFacade(metadata) return MultiFileClassFacade(metadata)
@@ -303,8 +294,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
checkMetadataVersion(metadataVersion) checkMetadataVersion(metadataVersion)
val (d1, d2) = writeProtoBufData(t.build(), c) val (d1, d2) = writeProtoBufData(t.build(), c)
val metadata = KotlinClassHeader( val metadata = KotlinClassHeader(
KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND, metadataVersion, KotlinClassHeader.COMPATIBLE_BYTECODE_VERSION, KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND, metadataVersion, d1, d2, facadeClassName, null, extraInt
d1, d2, facadeClassName, null, extraInt
) )
return MultiFileClassPart(metadata) return MultiFileClassPart(metadata)
} }
@@ -19,7 +19,7 @@ import kotlin.test.assertFailsWith
class MetadataSmokeTest { class MetadataSmokeTest {
private fun Class<*>.readMetadata(): KotlinClassHeader { private fun Class<*>.readMetadata(): KotlinClassHeader {
return getAnnotation(Metadata::class.java).run { return getAnnotation(Metadata::class.java).run {
KotlinClassHeader(kind, metadataVersion, bytecodeVersion, data1, data2, extraString, packageName, extraInt) KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt)
} }
} }
@@ -75,7 +75,6 @@ class MetadataSmokeTest {
// Use the created KotlinMetadata instance to write @kotlin.Metadata annotation on the class file // Use the created KotlinMetadata instance to write @kotlin.Metadata annotation on the class file
visitAnnotation("Lkotlin/Metadata;", true).run { visitAnnotation("Lkotlin/Metadata;", true).run {
visit("mv", header.metadataVersion) visit("mv", header.metadataVersion)
visit("bv", header.bytecodeVersion)
visit("k", header.kind) visit("k", header.kind)
visitArray("d1").run { visitArray("d1").run {
header.data1.forEach { visit(null, it) } header.data1.forEach { visit(null, it) }
@@ -160,7 +159,6 @@ class MetadataSmokeTest {
KotlinClassHeader( KotlinClassHeader(
kind = annotation.kind, kind = annotation.kind,
metadataVersion = annotation.metadataVersion, metadataVersion = annotation.metadataVersion,
bytecodeVersion = annotation.bytecodeVersion,
data1 = annotation.data1, data1 = annotation.data1,
data2 = annotation.data2, data2 = annotation.data2,
extraInt = annotation.extraInt, extraInt = annotation.extraInt,
@@ -31,7 +31,6 @@ private fun readMetadataVisitor(output: (KotlinClassHeader) -> Unit): Annotation
object : AnnotationVisitor(Opcodes.API_VERSION) { object : AnnotationVisitor(Opcodes.API_VERSION) {
var kind: Int? = null var kind: Int? = null
var metadataVersion: IntArray? = null var metadataVersion: IntArray? = null
var bytecodeVersion: IntArray? = null
var data1: Array<String>? = null var data1: Array<String>? = null
var data2: Array<String>? = null var data2: Array<String>? = null
var extraString: String? = null var extraString: String? = null
@@ -42,7 +41,6 @@ private fun readMetadataVisitor(output: (KotlinClassHeader) -> Unit): Annotation
when (name) { when (name) {
"k" -> kind = value as? Int "k" -> kind = value as? Int
"mv" -> metadataVersion = value as? IntArray "mv" -> metadataVersion = value as? IntArray
"bv" -> bytecodeVersion = value as? IntArray
"xs" -> extraString = value as? String "xs" -> extraString = value as? String
"xi" -> extraInt = value as? Int "xi" -> extraInt = value as? Int
"pn" -> packageName = value as? String "pn" -> packageName = value as? String
@@ -71,6 +69,6 @@ private fun readMetadataVisitor(output: (KotlinClassHeader) -> Unit): Annotation
} }
override fun visitEnd() { override fun visitEnd() {
output(KotlinClassHeader(kind, metadataVersion, bytecodeVersion, data1, data2, extraString, packageName, extraInt)) output(KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt))
} }
} }