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.
This commit is contained in:
Nikolay Krasko
2015-07-02 00:49:08 +03:00
parent 64379947fd
commit d564f44aad
4 changed files with 19 additions and 4 deletions
@@ -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<DecompiledText> = LockedClearableLazyValue(Any()) {
buildDecompiledText(getVirtualFile())
}
@@ -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<DecompiledText>
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()
}
@@ -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<DecompiledText> = LockedClearableLazyValue(Any()) {
buildDecompiledTextFromJsMetadata(getVirtualFile())
}
@@ -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<String> = 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(