From d564f44aad0d5c81dc1bd2eb13e4728fc89e70ca Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 2 Jul 2015 00:49:08 +0300 Subject: [PATCH] Getting decompiled file content through getPsi() doesn't work for local class files Decompiler view providers are created with EmptyFileManager (see ClassFileDecompiler.decompile()). This makes impossible to create psi file for virtual class file in local file system because parent directory is null in SingleRootFileViewProvider.createFile() pre-check. --- .../kotlin/idea/decompiler/JetClsFile.kt | 2 +- .../kotlin/idea/decompiler/KotlinClsFileBase.kt | 3 ++- .../idea/decompiler/KotlinJavascriptMetaFile.kt | 2 +- .../idea/decompiler/kotlinFileViewProviders.kt | 16 +++++++++++++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/JetClsFile.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/JetClsFile.kt index 2d95436f4ba..b5a5025a8ba 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/JetClsFile.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/JetClsFile.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledText import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue -public class JetClsFile(provider: FileViewProvider) : KotlinClsFileBase(provider) { +public class JetClsFile(provider: KotlinClassFileViewProvider) : KotlinClsFileBase(provider) { protected override val decompiledText: LockedClearableLazyValue = LockedClearableLazyValue(Any()) { buildDecompiledText(getVirtualFile()) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/KotlinClsFileBase.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/KotlinClsFileBase.kt index 7b326885d03..7f1f500dd35 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/KotlinClsFileBase.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/KotlinClsFileBase.kt @@ -32,7 +32,7 @@ import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue -public abstract class KotlinClsFileBase(provider: FileViewProvider) : JetFile(provider, true) { +public abstract class KotlinClsFileBase(val provider: KotlinClassFileViewProvider) : JetFile(provider, true) { protected abstract val decompiledText: LockedClearableLazyValue public fun getDeclarationForDescriptor(descriptor: DeclarationDescriptor): JetDeclaration? { @@ -67,6 +67,7 @@ public abstract class KotlinClsFileBase(provider: FileViewProvider) : JetFile(pr override fun onContentReload() { super.onContentReload() + provider.content.drop() decompiledText.drop() } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/KotlinJavascriptMetaFile.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/KotlinJavascriptMetaFile.kt index 8224a4b9071..078d80fbc5d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/KotlinJavascriptMetaFile.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/KotlinJavascriptMetaFile.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledTextFromJ import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue -public class KotlinJavascriptMetaFile(provider: FileViewProvider) : KotlinClsFileBase(provider) { +public class KotlinJavascriptMetaFile(provider: KotlinClassFileViewProvider) : KotlinClsFileBase(provider) { protected override val decompiledText: LockedClearableLazyValue = LockedClearableLazyValue(Any()) { buildDecompiledTextFromJsMetadata(getVirtualFile()) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/kotlinFileViewProviders.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/kotlinFileViewProviders.kt index 3ffbafa4439..eb3634c1c67 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/kotlinFileViewProviders.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/kotlinFileViewProviders.kt @@ -33,7 +33,21 @@ abstract class KotlinClassFileViewProvider( manager: PsiManager, file: VirtualFile, physical: Boolean) : SingleRootFileViewProvider(manager, file, physical, JetLanguage.INSTANCE) { - override fun getContents(): CharSequence = getPsi(JetLanguage.INSTANCE)?.getText() ?: "" + val content : LockedClearableLazyValue = LockedClearableLazyValue(Any()) { + val psiFile = createFile(manager.getProject(), file, JetFileType.INSTANCE) + val text = psiFile?.getText() ?: "" + + (psiFile as? PsiFileImpl)?.markInvalidated() + + text + } + + override fun createFile(project: Project, file: VirtualFile, fileType: FileType): PsiFile? { + // Workaround for KT-8344 + return super.createFile(project, file, fileType) + } + + override fun getContents() = content.get() } public class JetClassFileViewProvider(