From fd24031a6983158f486a6b46a76760ee4f5d946e Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 30 Jan 2017 17:26:24 +0100 Subject: [PATCH] Don't read file content to see if file is Kotlin-compiled if we have cached attribute but don't have complete data --- .../idea/caches/IDEKotlinBinaryClassCache.kt | 16 ++++++++++++++++ .../classFile/ClassFileDecompilerUtil.kt | 16 ++-------------- .../classFile/KotlinClassFileDecompiler.kt | 2 +- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/IDEKotlinBinaryClassCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/IDEKotlinBinaryClassCache.kt index c90cd2c1bf2..9a0f3133a60 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/IDEKotlinBinaryClassCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/IDEKotlinBinaryClassCache.kt @@ -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) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/ClassFileDecompilerUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/ClassFileDecompilerUtil.kt index 500083d9746..18e3ff93eef 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/ClassFileDecompilerUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/ClassFileDecompilerUtil.kt @@ -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(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 } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClassFileDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClassFileDecompiler.kt index ca9df8f7510..4823d6c1b0f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClassFileDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/KotlinClassFileDecompiler.kt @@ -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