BinaryVersion: introduce isCompatibleWithCurrentCompilerVersion

This commit is contained in:
Mikhail Glukhikh
2022-12-02 14:08:27 +01:00
parent f6b8b3438a
commit 89dd28226b
12 changed files with 16 additions and 13 deletions
@@ -53,7 +53,7 @@ class BuiltInDefinitionFile(
val stream = ByteArrayInputStream(contents)
val version = BuiltInsBinaryVersion.readFrom(stream)
if (!version.isCompatible()) {
if (!version.isCompatibleWithCurrentCompilerVersion()) {
return Incompatible(version)
}
@@ -170,7 +170,7 @@ private data class BinaryVersionAndPackageFragment(
fun createFromStream(stream: InputStream): BinaryVersionAndPackageFragment {
val version = BuiltInsBinaryVersion.readFrom(stream)
if (!version.isCompatible()) {
if (!version.isCompatibleWithCurrentCompilerVersion()) {
// TODO: report a proper diagnostic
throw UnsupportedOperationException(
"Kotlin built-in definition format version is not supported: " +
@@ -6,7 +6,7 @@ import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
class KlibIrVersion(major: Int, minor: Int, patch: Int) : BinaryVersion(major, minor, patch) {
override fun isCompatible(): Boolean = isCompatibleTo(INSTANCE)
override fun isCompatibleWithCurrentCompilerVersion(): Boolean = isCompatibleTo(INSTANCE)
companion object {
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
class KlibMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
override fun isCompatible(): Boolean = isCompatibleTo(INSTANCE)
override fun isCompatibleWithCurrentCompilerVersion(): Boolean = isCompatibleTo(INSTANCE)
companion object {
@JvmField
@@ -155,7 +155,7 @@ class MetadataPackageFragment(
private fun readProto(stream: InputStream): Triple<ProtoBuf.PackageFragment, NameResolverImpl, BuiltInsBinaryVersion> {
val version = BuiltInsBinaryVersion.readFrom(stream)
if (!version.isCompatible()) {
if (!version.isCompatibleWithCurrentCompilerVersion()) {
// TODO: report a proper diagnostic
throw UnsupportedOperationException(
"Kotlin metadata definition format version is not supported: " +
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
class JvmMetadataVersion(versionArray: IntArray, val isStrictSemantics: Boolean) : BinaryVersion(*versionArray) {
constructor(vararg numbers: Int) : this(numbers, isStrictSemantics = false)
override fun isCompatible(): Boolean =
override fun isCompatibleWithCurrentCompilerVersion(): Boolean =
// NOTE: 1.0 is a pre-Kotlin-1.0 metadata version, with which the current compiler is incompatible
(major != 1 || minor != 0) &&
if (isStrictSemantics) {
@@ -14,7 +14,7 @@ import java.io.InputStream
* of the core protobuf messages (metadata.proto).
*/
class BuiltInsBinaryVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
override fun isCompatible(): Boolean =
override fun isCompatibleWithCurrentCompilerVersion(): Boolean =
this.isCompatibleTo(INSTANCE)
companion object {
@@ -13,7 +13,7 @@ fun InputStream.readBuiltinsPackageFragment(): Pair<ProtoBuf.PackageFragment?, B
use { stream ->
val version = BuiltInsBinaryVersion.readFrom(stream)
val proto =
if (version.isCompatible()) ProtoBuf.PackageFragment.parseFrom(
if (version.isCompatibleWithCurrentCompilerVersion()) ProtoBuf.PackageFragment.parseFrom(
stream,
ExtensionRegistryLite.newInstance().apply(BuiltInsProtoBuf::registerAllExtensions)
)
@@ -25,7 +25,10 @@ abstract class BinaryVersion(private vararg val numbers: Int) {
numbers.asList().subList(3, numbers.size).toList()
} else emptyList()
abstract fun isCompatible(): Boolean
@Deprecated("Please use isCompatibleWithCurrentCompilerVersion()", ReplaceWith("isCompatibleWithCurrentCompilerVersion()"))
fun isCompatible(): Boolean = isCompatibleWithCurrentCompilerVersion()
abstract fun isCompatibleWithCurrentCompilerVersion(): Boolean
fun toArray(): IntArray = numbers
@@ -14,7 +14,7 @@ import java.util.*
class KotlinJavascriptMetadata(val version: JsMetadataVersion, val moduleName: String, val body: ByteArray)
class JsMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
override fun isCompatible(): Boolean =
override fun isCompatibleWithCurrentCompilerVersion(): Boolean =
this.isCompatibleTo(INSTANCE)
fun toInteger() = (patch shl 16) + (minOf(minor, 255) shl 8) + minOf(major, 255)
@@ -194,7 +194,7 @@ public class JsConfig {
Set<String> moduleNames = new LinkedHashSet<>();
for (KotlinJavascriptMetadata metadata : metadataList) {
if (!metadata.getVersion().isCompatible() && !skipMetadataVersionCheck) {
if (!metadata.getVersion().isCompatibleWithCurrentCompilerVersion() && !skipMetadataVersionCheck) {
report.error("File '" + path + "' was compiled with an incompatible version of Kotlin. " +
"The binary version of its metadata is " + metadata.getVersion() +
", expected version is " + JsMetadataVersion.INSTANCE);
@@ -296,7 +296,7 @@ public class JsConfig {
private ModuleDescriptorImpl createModuleDescriptor(KotlinJavascriptMetadata metadata) {
return factoryMap.computeIfAbsent(metadata, m -> {
LanguageVersionSettings languageVersionSettings = CommonConfigurationKeysKt.getLanguageVersionSettings(configuration);
assert m.getVersion().isCompatible() ||
assert m.getVersion().isCompatibleWithCurrentCompilerVersion() ||
languageVersionSettings.getFlag(AnalysisFlags.getSkipMetadataVersionCheck()) :
"Expected JS metadata version " + JsMetadataVersion.INSTANCE + ", but actual metadata version is " + m.getVersion();
@@ -32,7 +32,7 @@ internal class DefaultNativeLibraryLoader(
logger.fatal("Library does not have metadata version specified in manifest: $file")
val metadataVersion = library.metadataVersion
if (metadataVersion?.isCompatible() != true)
if (metadataVersion?.isCompatibleWithCurrentCompilerVersion() != true)
logger.fatal(
"""
Library has incompatible metadata version ${metadataVersion ?: "\"unknown\""}: $file