From 3e94246c45a33146209ee7679bf0e3fd2d314280 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 7 Nov 2013 17:25:14 +0400 Subject: [PATCH] Add ability to use ctrl+click in decompiled kotlin files --- .../libraries/DecompiledDataFactory.java | 3 +- .../JetContentBasedFileSubstitutor.java | 44 ++++++++++++++++++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java index 6b4725d0d5c..900a4f3abbc 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java @@ -61,8 +61,7 @@ public final class DecompiledDataFactory { private DecompiledDataFactory(@NotNull VirtualFile classFile, @NotNull Project project) { this.classFile = classFile; this.project = project; - InjectorForJavaDescriptorResolver injector = - new InjectorForJavaDescriptorResolver(project, new BindingTraceContext()); + InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver(project, new BindingTraceContext()); this.javaDescriptorResolver = injector.getJavaDescriptorResolver(); VirtualFileKotlinClass kotlinClass = new VirtualFileKotlinClass(classFile); diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetContentBasedFileSubstitutor.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetContentBasedFileSubstitutor.java index af1d2cc604f..04cd504e6ba 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetContentBasedFileSubstitutor.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetContentBasedFileSubstitutor.java @@ -16,18 +16,55 @@ package org.jetbrains.jet.plugin.libraries; +import com.google.common.collect.Maps; +import com.intellij.AppTopics; import com.intellij.lang.Language; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileDocumentManagerAdapter; import com.intellij.openapi.fileTypes.ContentBasedClassFileProcessor; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.impl.PsiDocumentManagerBase; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.plugin.highlighter.JetHighlighter; +import java.util.concurrent.ConcurrentMap; + public final class JetContentBasedFileSubstitutor implements ContentBasedClassFileProcessor { + private static final JetContentBasedFileSubstitutor instance = new JetContentBasedFileSubstitutor(); + + private static final ConcurrentMap deferredDocumentBinding = Maps.newConcurrentMap(); + + public static JetContentBasedFileSubstitutor getInstance() { + return instance; + } + + private JetContentBasedFileSubstitutor() { + ApplicationManager.getApplication().getMessageBus().connect().subscribe(AppTopics.FILE_DOCUMENT_SYNC, new FileDocumentManagerAdapter() { + @Override + public void fileContentLoaded(@NotNull VirtualFile loadedFile, @NotNull Document document) { + processDeferredBindings(loadedFile, document); + } + + @Override + public void fileContentReloaded(VirtualFile loadedFile, @NotNull Document document) { + processDeferredBindings(loadedFile, document); + } + + private void processDeferredBindings(VirtualFile loadedFile, @NotNull Document document) { + JetFile file = deferredDocumentBinding.remove(loadedFile); + if (file != null) { + PsiDocumentManagerBase.cachePsi(document, file); + } + } + }); + } @Override public boolean isApplicable(@Nullable Project project, @NotNull final VirtualFile file) { @@ -53,8 +90,11 @@ public final class JetContentBasedFileSubstitutor implements ContentBasedClassFi @NotNull @Override public String obtainFileText(Project project, VirtualFile file) { - if (DecompiledUtils.isKotlinCompiledFile(file)) { - return JetDecompiledData.getDecompiledData(file, project).getFileText(); + if (file != null && DecompiledUtils.isKotlinCompiledFile(file)) { + JetDecompiledData data = JetDecompiledData.getDecompiledData(file, project); + deferredDocumentBinding.put(file, data.getFile()); + + return data.getFileText(); } return ""; }