Add ability to use ctrl+click in decompiled kotlin files

This commit is contained in:
Nikolay Krasko
2013-11-07 17:25:14 +04:00
parent 98e9b387b6
commit 3e94246c45
2 changed files with 43 additions and 4 deletions
@@ -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);
@@ -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<VirtualFile, JetFile> 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 "";
}