Write and read built-ins binary version
This commit is contained in:
+4
-5
@@ -22,6 +22,7 @@ import com.intellij.psi.search.GlobalSearchScope
|
|||||||
import org.jetbrains.kotlin.analyzer.ModuleContent
|
import org.jetbrains.kotlin.analyzer.ModuleContent
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
import org.jetbrains.kotlin.builtins.BuiltInsSerializedResourcePaths
|
import org.jetbrains.kotlin.builtins.BuiltInsSerializedResourcePaths
|
||||||
|
import org.jetbrains.kotlin.builtins.BuiltinsPackageFragment
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||||
@@ -149,11 +150,9 @@ public class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) {
|
|||||||
|
|
||||||
val builtinsFileStream = ByteArrayOutputStream()
|
val builtinsFileStream = ByteArrayOutputStream()
|
||||||
with(DataOutputStream(builtinsFileStream)) {
|
with(DataOutputStream(builtinsFileStream)) {
|
||||||
// TODO: write version properly
|
val version = BuiltinsPackageFragment.VERSION.toArray()
|
||||||
writeInt(3)
|
writeInt(version.size)
|
||||||
writeInt(1)
|
version.forEach { writeInt(it) }
|
||||||
writeInt(0)
|
|
||||||
writeInt(0)
|
|
||||||
}
|
}
|
||||||
message.build().writeTo(builtinsFileStream)
|
message.build().writeTo(builtinsFileStream)
|
||||||
write(destDir, BuiltInsSerializedResourcePaths.getBuiltInsFilePath(fqName), builtinsFileStream)
|
write(destDir, BuiltInsSerializedResourcePaths.getBuiltInsFilePath(fqName), builtinsFileStream)
|
||||||
|
|||||||
@@ -23,8 +23,7 @@ public final class AbiVersionUtil {
|
|||||||
public static final BinaryVersion INVALID_VERSION = BinaryVersion.create(new int[0]);
|
public static final BinaryVersion INVALID_VERSION = BinaryVersion.create(new int[0]);
|
||||||
|
|
||||||
public static boolean isAbiVersionCompatible(@NotNull BinaryVersion actual) {
|
public static boolean isAbiVersionCompatible(@NotNull BinaryVersion actual) {
|
||||||
return actual.getMajor() == JvmAbi.VERSION.getMajor() &&
|
return actual.isCompatibleTo(JvmAbi.VERSION);
|
||||||
actual.getMinor() <= JvmAbi.VERSION.getMinor();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private AbiVersionUtil() {
|
private AbiVersionUtil() {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf
|
import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment
|
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
@@ -35,4 +36,9 @@ public class BuiltinsPackageFragment(
|
|||||||
protected override fun loadClassNames(packageProto: ProtoBuf.Package): Collection<Name> {
|
protected override fun loadClassNames(packageProto: ProtoBuf.Package): Collection<Name> {
|
||||||
return packageProto.getExtension(BuiltInsProtoBuf.className)?.map { id -> nameResolver.getName(id) } ?: listOf()
|
return packageProto.getExtension(BuiltInsProtoBuf.className)?.map { id -> nameResolver.getName(id) } ?: listOf()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
// Advance this version when the common or builtins-specific binary metadata format is changed
|
||||||
|
val VERSION = BinaryVersion.create(1, 0, 0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -25,6 +25,17 @@ data class BinaryVersion private constructor(
|
|||||||
fun toArray(): IntArray =
|
fun toArray(): IntArray =
|
||||||
intArrayOf(major, minor, patch, *rest.toIntArray())
|
intArrayOf(major, minor, patch, *rest.toIntArray())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if this version of some format loaded from some binaries is compatible
|
||||||
|
* to the expected version of that format in the current compiler.
|
||||||
|
*
|
||||||
|
* @param ourVersion the version of this format in the current compiler
|
||||||
|
*/
|
||||||
|
fun isCompatibleTo(ourVersion: BinaryVersion): Boolean {
|
||||||
|
return if (major == 0) ourVersion.major == 0 && minor == ourVersion.minor
|
||||||
|
else major == ourVersion.major && minor <= ourVersion.minor
|
||||||
|
}
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
val versions = toArray().takeWhile { it != UNKNOWN }
|
val versions = toArray().takeWhile { it != UNKNOWN }
|
||||||
return if (versions.isEmpty()) "unknown" else versions.joinToString(".")
|
return if (versions.isEmpty()) "unknown" else versions.joinToString(".")
|
||||||
|
|||||||
+7
-7
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.serialization.deserialization
|
package org.jetbrains.kotlin.serialization.deserialization
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.builtins.BuiltinsPackageFragment
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -40,15 +41,14 @@ public abstract class DeserializedPackageFragment(
|
|||||||
|
|
||||||
val builtinsMessage = serializedResourcePaths.getBuiltInsFilePath(fqName)?.let(loadResource)?.let { stream ->
|
val builtinsMessage = serializedResourcePaths.getBuiltInsFilePath(fqName)?.let(loadResource)?.let { stream ->
|
||||||
val dataInput = DataInputStream(stream)
|
val dataInput = DataInputStream(stream)
|
||||||
val version = (1..dataInput.readInt()).map { dataInput.readInt() }
|
val version = BinaryVersion.create((1..dataInput.readInt()).map { dataInput.readInt() }.toIntArray())
|
||||||
|
|
||||||
// TODO: check version correctly
|
if (!version.isCompatibleTo(BuiltinsPackageFragment.VERSION)) {
|
||||||
if (!(version.size == 3 && version.let {
|
// TODO: report a proper diagnostic
|
||||||
val (major, minor, patch) = it
|
|
||||||
major == 1 && minor == 0 && patch == 0
|
|
||||||
})) {
|
|
||||||
throw UnsupportedOperationException(
|
throw UnsupportedOperationException(
|
||||||
"Kotlin built-in definition format version is not supported: expected 1.0.0, actual ${version.joinToString(".")}"
|
"Kotlin built-in definition format version is not supported: " +
|
||||||
|
"expected ${BuiltinsPackageFragment.VERSION}, actual $version. " +
|
||||||
|
"Please update Kotlin"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user