Don't read file content to see if file is Kotlin-compiled if we have cached attribute but don't have complete data

This commit is contained in:
Dmitry Jemerov
2017-01-30 17:26:24 +01:00
parent ffa3cf0027
commit fd24031a69
3 changed files with 19 additions and 15 deletions
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.idea.caches
import com.intellij.ide.highlighter.JavaClassFileType
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.util.Key
import com.intellij.openapi.vfs.VirtualFile
@@ -28,6 +29,21 @@ object IDEKotlinBinaryClassCache {
data class KotlinBinaryHeaderData(val classHeader: KotlinClassHeader, val classId: ClassId)
data class KotlinBinaryData(val isKotlinBinary: Boolean, val timestamp: Long, val headerData: KotlinBinaryHeaderData?)
/**
* Checks if this file is a compiled Kotlin class file (not necessarily ABI-compatible with the current plugin)
*/
fun isKotlinJvmCompiledFile(file: VirtualFile): Boolean {
if (file.extension != JavaClassFileType.INSTANCE!!.defaultExtension) {
return false
}
val cached = getKotlinBinaryFromCache(file)
if (cached != null) {
return cached.isKotlinBinary
}
return getKotlinBinaryClass(file) != null
}
fun getKotlinBinaryClass(file: VirtualFile, fileContent: ByteArray? = null): KotlinJvmBinaryClass? {
val cached = getKotlinBinaryFromCache(file)
if (cached != null && !cached.isKotlinBinary) {
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.idea.decompiler.classFile
import com.intellij.ide.highlighter.JavaClassFileType
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.util.Key
import com.intellij.openapi.vfs.VirtualFile
@@ -36,22 +35,11 @@ val KOTLIN_COMPILED_FILE_ATTRIBUTE: String = "kotlin-compiled-file".apply {
val KEY = Key.create<IsKotlinBinary>(KOTLIN_COMPILED_FILE_ATTRIBUTE)
/**
* Checks if this file is a compiled Kotlin class file (not necessarily ABI-compatible with the current plugin)
*/
fun isKotlinJvmCompiledFile(file: VirtualFile): Boolean {
if (file.extension != JavaClassFileType.INSTANCE!!.defaultExtension) {
return false
}
return IDEKotlinBinaryClassCache.getKotlinBinaryClassHeaderData(file) != null
}
/**
* Checks if this file is a compiled Kotlin class file ABI-compatible with the current plugin
*/
fun isKotlinWithCompatibleAbiVersion(file: VirtualFile): Boolean {
if (!isKotlinJvmCompiledFile(file)) return false
if (!IDEKotlinBinaryClassCache.isKotlinJvmCompiledFile(file)) return false
val kotlinClass = IDEKotlinBinaryClassCache.getKotlinBinaryClassHeaderData(file)
return kotlinClass != null && kotlinClass.classHeader.metadataVersion.isCompatible()
@@ -62,7 +50,7 @@ fun isKotlinWithCompatibleAbiVersion(file: VirtualFile): Boolean {
* which should NOT be decompiled (and, as a result, shown under the library in the Project view, be searchable via Find class, etc.)
*/
fun isKotlinInternalCompiledFile(file: VirtualFile): Boolean {
if (!isKotlinJvmCompiledFile(file)) {
if (!IDEKotlinBinaryClassCache.isKotlinJvmCompiledFile(file)) {
return false
}
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.types.isFlexible
class KotlinClassFileDecompiler : ClassFileDecompilers.Full() {
private val stubBuilder = KotlinClsStubBuilder()
override fun accepts(file: VirtualFile) = isKotlinJvmCompiledFile(file)
override fun accepts(file: VirtualFile) = IDEKotlinBinaryClassCache.isKotlinJvmCompiledFile(file)
override fun getStubBuilder() = stubBuilder