Try to recover from corrupt VFS data for a .kotlin_module file
#KT-13135 Fixed
This commit is contained in:
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfigu
|
|||||||
import org.jetbrains.kotlin.serialization.jvm.JvmPackageTable
|
import org.jetbrains.kotlin.serialization.jvm.JvmPackageTable
|
||||||
import java.io.ByteArrayInputStream
|
import java.io.ByteArrayInputStream
|
||||||
import java.io.DataInputStream
|
import java.io.DataInputStream
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
class ModuleMapping private constructor(val packageFqName2Parts: Map<String, PackageParts>, private val debugName: String) {
|
class ModuleMapping private constructor(val packageFqName2Parts: Map<String, PackageParts>, private val debugName: String) {
|
||||||
fun findPackageParts(packageFqName: String): PackageParts? {
|
fun findPackageParts(packageFqName: String): PackageParts? {
|
||||||
@@ -35,6 +36,9 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map<String, Pac
|
|||||||
@JvmField
|
@JvmField
|
||||||
val EMPTY: ModuleMapping = ModuleMapping(emptyMap(), "EMPTY")
|
val EMPTY: ModuleMapping = ModuleMapping(emptyMap(), "EMPTY")
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val CORRUPTED: ModuleMapping = ModuleMapping(emptyMap(), "CORRUPTED")
|
||||||
|
|
||||||
fun create(
|
fun create(
|
||||||
bytes: ByteArray?,
|
bytes: ByteArray?,
|
||||||
debugName: String,
|
debugName: String,
|
||||||
@@ -45,7 +49,15 @@ class ModuleMapping private constructor(val packageFqName2Parts: Map<String, Pac
|
|||||||
}
|
}
|
||||||
|
|
||||||
val stream = DataInputStream(ByteArrayInputStream(bytes))
|
val stream = DataInputStream(ByteArrayInputStream(bytes))
|
||||||
val version = JvmMetadataVersion(*IntArray(stream.readInt()) { stream.readInt() })
|
|
||||||
|
val versionNumber = try {
|
||||||
|
IntArray(stream.readInt()) { stream.readInt() }
|
||||||
|
}
|
||||||
|
catch (e: IOException) {
|
||||||
|
return CORRUPTED
|
||||||
|
}
|
||||||
|
|
||||||
|
val version = JvmMetadataVersion(*versionNumber)
|
||||||
|
|
||||||
if (configuration.skipMetadataVersionCheck || version.isCompatible()) {
|
if (configuration.skipMetadataVersionCheck || version.isCompatible()) {
|
||||||
val table = JvmPackageTable.PackageTable.parseFrom(stream) ?: return EMPTY
|
val table = JvmPackageTable.PackageTable.parseFrom(stream) ?: return EMPTY
|
||||||
|
|||||||
+3
@@ -79,6 +79,9 @@ object KotlinModuleMappingIndex : FileBasedIndexExtension<String, PackageParts>(
|
|||||||
val file = inputData.file
|
val file = inputData.file
|
||||||
try {
|
try {
|
||||||
val moduleMapping = ModuleMapping.create(content, file.toString(), DeserializationConfiguration.Default)
|
val moduleMapping = ModuleMapping.create(content, file.toString(), DeserializationConfiguration.Default)
|
||||||
|
if (moduleMapping === ModuleMapping.CORRUPTED) {
|
||||||
|
file.refresh(true, false)
|
||||||
|
}
|
||||||
return@DataIndexer moduleMapping.packageFqName2Parts
|
return@DataIndexer moduleMapping.packageFqName2Parts
|
||||||
}
|
}
|
||||||
catch(e: Exception) {
|
catch(e: Exception) {
|
||||||
|
|||||||
Reference in New Issue
Block a user