Drop JvmMetadataVersion.skipCheck, support this correctly
Pass the value of this flag via DeserializationConfiguration
This commit is contained in:
+11
-8
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.serialization.deserialization.DeserializationCompone
|
||||
import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.check
|
||||
import javax.inject.Inject
|
||||
|
||||
class DeserializedDescriptorResolver {
|
||||
@@ -39,6 +38,9 @@ class DeserializedDescriptorResolver {
|
||||
this.components = components.components
|
||||
}
|
||||
|
||||
private val skipMetadataVersionCheck: Boolean
|
||||
get() = components.configuration.skipMetadataVersionCheck
|
||||
|
||||
fun resolveClass(kotlinClass: KotlinJvmBinaryClass): ClassDescriptor? {
|
||||
val classData = readClassData(kotlinClass) ?: return null
|
||||
return components.classDeserializer.deserializeClass(kotlinClass.classId, classData)
|
||||
@@ -69,18 +71,18 @@ class DeserializedDescriptorResolver {
|
||||
|
||||
private val KotlinJvmBinaryClass.incompatibility: IncompatibleVersionErrorData<JvmMetadataVersion>?
|
||||
get() {
|
||||
if (classHeader.metadataVersion.isCompatible()) return null
|
||||
if (skipMetadataVersionCheck || classHeader.metadataVersion.isCompatible()) return null
|
||||
return IncompatibleVersionErrorData(classHeader.metadataVersion, JvmMetadataVersion.INSTANCE, location, classId)
|
||||
}
|
||||
|
||||
private val KotlinJvmBinaryClass.isPreReleaseInvisible: Boolean
|
||||
get() = !JvmMetadataVersion.skipCheck &&
|
||||
get() = !skipMetadataVersionCheck &&
|
||||
!KotlinCompilerVersion.isPreRelease() &&
|
||||
(classHeader.isPreRelease || classHeader.metadataVersion == KOTLIN_1_1_EAP_METADATA_VERSION)
|
||||
|
||||
internal fun readData(kotlinClass: KotlinJvmBinaryClass, expectedKinds: Set<KotlinClassHeader.Kind>): Array<String>? {
|
||||
val header = kotlinClass.classHeader
|
||||
return (header.data ?: header.incompatibleData)?.check { header.kind in expectedKinds }
|
||||
return (header.data ?: header.incompatibleData)?.takeIf { header.kind in expectedKinds }
|
||||
}
|
||||
|
||||
private inline fun <T : Any> parseProto(klass: KotlinJvmBinaryClass, block: () -> T): T? {
|
||||
@@ -93,11 +95,12 @@ class DeserializedDescriptorResolver {
|
||||
}
|
||||
}
|
||||
catch (e: Throwable) {
|
||||
if (!klass.classHeader.metadataVersion.isCompatible()) {
|
||||
// TODO: log.warn
|
||||
return null
|
||||
if (skipMetadataVersionCheck || klass.classHeader.metadataVersion.isCompatible()) {
|
||||
throw e
|
||||
}
|
||||
throw e
|
||||
|
||||
// TODO: log.warn
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-4
@@ -25,12 +25,9 @@ import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion
|
||||
class JvmMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) {
|
||||
// NOTE: 1.1 is incompatible with 1.0 and hence with any other version except 1.1.*
|
||||
override fun isCompatible() =
|
||||
skipCheck || (this.major == 1 && this.minor == 1)
|
||||
this.major == 1 && this.minor == 1
|
||||
|
||||
companion object {
|
||||
// TODO: this is a temporary hack which can be removed once we migrate the IDEA code from 1.0 to 1.1
|
||||
var skipCheck: Boolean = false
|
||||
|
||||
@JvmField
|
||||
val INSTANCE = JvmMetadataVersion(1, 1, 5)
|
||||
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
|
||||
package org.jetbrains.kotlin.load.kotlin
|
||||
|
||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmPackageTable
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.io.DataInputStream
|
||||
import kotlin.comparisons.nullsLast
|
||||
|
||||
class ModuleMapping private constructor(val packageFqName2Parts: Map<String, PackageParts>, private val debugName: String) {
|
||||
fun findPackageParts(packageFqName: String): PackageParts? {
|
||||
@@ -35,7 +35,11 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map<String, Pac
|
||||
@JvmField
|
||||
val EMPTY: ModuleMapping = ModuleMapping(emptyMap(), "EMPTY")
|
||||
|
||||
fun create(bytes: ByteArray?, debugName: String?): ModuleMapping {
|
||||
fun create(
|
||||
bytes: ByteArray?,
|
||||
debugName: String,
|
||||
configuration: DeserializationConfiguration
|
||||
): ModuleMapping {
|
||||
if (bytes == null) {
|
||||
return EMPTY
|
||||
}
|
||||
@@ -43,7 +47,7 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map<String, Pac
|
||||
val stream = DataInputStream(ByteArrayInputStream(bytes))
|
||||
val version = JvmMetadataVersion(*IntArray(stream.readInt()) { stream.readInt() })
|
||||
|
||||
if (version.isCompatible()) {
|
||||
if (configuration.skipMetadataVersionCheck || version.isCompatible()) {
|
||||
val table = JvmPackageTable.PackageTable.parseFrom(stream) ?: return EMPTY
|
||||
val result = linkedMapOf<String, PackageParts>()
|
||||
|
||||
@@ -60,7 +64,7 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map<String, Pac
|
||||
proto.classNameList.forEach(packageParts::addMetadataPart)
|
||||
}
|
||||
|
||||
return ModuleMapping(result, debugName ?: "<unknown>")
|
||||
return ModuleMapping(result, debugName)
|
||||
}
|
||||
else {
|
||||
// TODO: consider reporting "incompatible ABI version" error for package parts
|
||||
|
||||
Reference in New Issue
Block a user