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
## 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
- ['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 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?,
metadataVersion: IntArray?,
bytecodeVersion: IntArray?,
@@ -33,6 +39,17 @@ class KotlinClassHeader(
packageName: String?,
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.
*
@@ -59,6 +76,10 @@ class KotlinClassHeader(
* @see Metadata.bytecodeVersion
* @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()
/**
@@ -149,6 +170,10 @@ class KotlinClassHeader(
*
* @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
val COMPATIBLE_BYTECODE_VERSION = JvmBytecodeBinaryVersion.INSTANCE.toArray().copyOf()
}
@@ -68,10 +68,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
): Class {
checkMetadataVersion(metadataVersion)
val (d1, d2) = writeProtoBufData(t.build(), c)
val metadata = KotlinClassHeader(
KotlinClassHeader.CLASS_KIND, metadataVersion, KotlinClassHeader.COMPATIBLE_BYTECODE_VERSION,
d1, d2, null, null, extraInt
)
val metadata = KotlinClassHeader(KotlinClassHeader.CLASS_KIND, metadataVersion, d1, d2, null, null, extraInt)
return Class(metadata)
}
}
@@ -122,10 +119,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
): FileFacade {
checkMetadataVersion(metadataVersion)
val (d1, d2) = writeProtoBufData(t.build(), c)
val metadata = KotlinClassHeader(
KotlinClassHeader.FILE_FACADE_KIND, metadataVersion, KotlinClassHeader.COMPATIBLE_BYTECODE_VERSION,
d1, d2, null, null, extraInt
)
val metadata = KotlinClassHeader(KotlinClassHeader.FILE_FACADE_KIND, metadataVersion, d1, d2, null, null, extraInt)
return FileFacade(metadata)
}
}
@@ -197,10 +191,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
val (d1, d2) =
if (proto != null) writeProtoBufData(proto, c)
else Pair(emptyArray(), emptyArray())
val metadata = KotlinClassHeader(
KotlinClassHeader.SYNTHETIC_CLASS_KIND, metadataVersion, KotlinClassHeader.COMPATIBLE_BYTECODE_VERSION,
d1, d2, null, null, extraInt
)
val metadata = KotlinClassHeader(KotlinClassHeader.SYNTHETIC_CLASS_KIND, metadataVersion, d1, d2, null, null, extraInt)
return SyntheticClass(metadata)
}
}
@@ -238,7 +229,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
): MultiFileClassFacade {
checkMetadataVersion(metadataVersion)
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
)
return MultiFileClassFacade(metadata)
@@ -303,8 +294,7 @@ sealed class KotlinClassMetadata(val header: KotlinClassHeader) {
checkMetadataVersion(metadataVersion)
val (d1, d2) = writeProtoBufData(t.build(), c)
val metadata = KotlinClassHeader(
KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND, metadataVersion, KotlinClassHeader.COMPATIBLE_BYTECODE_VERSION,
d1, d2, facadeClassName, null, extraInt
KotlinClassHeader.MULTI_FILE_CLASS_PART_KIND, metadataVersion, d1, d2, facadeClassName, null, extraInt
)
return MultiFileClassPart(metadata)
}
@@ -19,7 +19,7 @@ import kotlin.test.assertFailsWith
class MetadataSmokeTest {
private fun Class<*>.readMetadata(): KotlinClassHeader {
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
visitAnnotation("Lkotlin/Metadata;", true).run {
visit("mv", header.metadataVersion)
visit("bv", header.bytecodeVersion)
visit("k", header.kind)
visitArray("d1").run {
header.data1.forEach { visit(null, it) }
@@ -160,7 +159,6 @@ class MetadataSmokeTest {
KotlinClassHeader(
kind = annotation.kind,
metadataVersion = annotation.metadataVersion,
bytecodeVersion = annotation.bytecodeVersion,
data1 = annotation.data1,
data2 = annotation.data2,
extraInt = annotation.extraInt,
@@ -31,7 +31,6 @@ private fun readMetadataVisitor(output: (KotlinClassHeader) -> Unit): Annotation
object : AnnotationVisitor(Opcodes.API_VERSION) {
var kind: Int? = null
var metadataVersion: IntArray? = null
var bytecodeVersion: IntArray? = null
var data1: Array<String>? = null
var data2: Array<String>? = null
var extraString: String? = null
@@ -42,7 +41,6 @@ private fun readMetadataVisitor(output: (KotlinClassHeader) -> Unit): Annotation
when (name) {
"k" -> kind = value as? Int
"mv" -> metadataVersion = value as? IntArray
"bv" -> bytecodeVersion = value as? IntArray
"xs" -> extraString = value as? String
"xi" -> extraInt = value as? Int
"pn" -> packageName = value as? String
@@ -71,6 +69,6 @@ private fun readMetadataVisitor(output: (KotlinClassHeader) -> Unit): Annotation
}
override fun visitEnd() {
output(KotlinClassHeader(kind, metadataVersion, bytecodeVersion, data1, data2, extraString, packageName, extraInt))
output(KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt))
}
}