Fight with valid absent, corrupted and missing files in archives (EA-119686)
Inspired by ClassFileViewProvider.
This commit is contained in:
+14
-4
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.decompiler.classFile
|
package org.jetbrains.kotlin.idea.decompiler.classFile
|
||||||
|
|
||||||
import com.intellij.openapi.components.ServiceManager
|
import com.intellij.openapi.components.ServiceManager
|
||||||
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.ClassFileViewProvider
|
import com.intellij.psi.ClassFileViewProvider
|
||||||
@@ -51,7 +52,7 @@ fun isKotlinWithCompatibleAbiVersion(file: VirtualFile): Boolean {
|
|||||||
*/
|
*/
|
||||||
fun isKotlinInternalCompiledFile(file: VirtualFile, fileContent: ByteArray? = null): Boolean {
|
fun isKotlinInternalCompiledFile(file: VirtualFile, fileContent: ByteArray? = null): Boolean {
|
||||||
// Don't crash on invalid files (EA-97751)
|
// Don't crash on invalid files (EA-97751)
|
||||||
if (!file.isValid || fileContent?.size == 0) {
|
if (!file.isValid || fileContent?.size == 0 || !file.exists()) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,10 +61,19 @@ fun isKotlinInternalCompiledFile(file: VirtualFile, fileContent: ByteArray? = nu
|
|||||||
}
|
}
|
||||||
|
|
||||||
val innerClass =
|
val innerClass =
|
||||||
if (fileContent == null)
|
try {
|
||||||
|
if (fileContent == null) {
|
||||||
ClassFileViewProvider.isInnerClass(file)
|
ClassFileViewProvider.isInnerClass(file)
|
||||||
else
|
} else {
|
||||||
ClassFileViewProvider.isInnerClass(file, fileContent)
|
ClassFileViewProvider.isInnerClass(file, fileContent)
|
||||||
|
}
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
Logger
|
||||||
|
.getInstance("org.jetbrains.kotlin.idea.decompiler.classFile.isKotlinInternalCompiledFile")
|
||||||
|
.debug(file.path, exception)
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
if (innerClass) {
|
if (innerClass) {
|
||||||
return true
|
return true
|
||||||
@@ -73,7 +83,7 @@ fun isKotlinInternalCompiledFile(file: VirtualFile, fileContent: ByteArray? = nu
|
|||||||
if (header.classId.isLocal) return true
|
if (header.classId.isLocal) return true
|
||||||
|
|
||||||
return header.kind == KotlinClassHeader.Kind.SYNTHETIC_CLASS ||
|
return header.kind == KotlinClassHeader.Kind.SYNTHETIC_CLASS ||
|
||||||
header.kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART
|
header.kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART
|
||||||
}
|
}
|
||||||
|
|
||||||
fun findMultifileClassParts(file: VirtualFile, classId: ClassId, partNames: List<String>): List<KotlinJvmBinaryClass> {
|
fun findMultifileClassParts(file: VirtualFile, classId: ClassId, partNames: List<String>): List<KotlinJvmBinaryClass> {
|
||||||
|
|||||||
Reference in New Issue
Block a user