Add ability to use ctrl+click in decompiled kotlin files
This commit is contained in:
@@ -61,8 +61,7 @@ public final class DecompiledDataFactory {
|
|||||||
private DecompiledDataFactory(@NotNull VirtualFile classFile, @NotNull Project project) {
|
private DecompiledDataFactory(@NotNull VirtualFile classFile, @NotNull Project project) {
|
||||||
this.classFile = classFile;
|
this.classFile = classFile;
|
||||||
this.project = project;
|
this.project = project;
|
||||||
InjectorForJavaDescriptorResolver injector =
|
InjectorForJavaDescriptorResolver injector = new InjectorForJavaDescriptorResolver(project, new BindingTraceContext());
|
||||||
new InjectorForJavaDescriptorResolver(project, new BindingTraceContext());
|
|
||||||
this.javaDescriptorResolver = injector.getJavaDescriptorResolver();
|
this.javaDescriptorResolver = injector.getJavaDescriptorResolver();
|
||||||
|
|
||||||
VirtualFileKotlinClass kotlinClass = new VirtualFileKotlinClass(classFile);
|
VirtualFileKotlinClass kotlinClass = new VirtualFileKotlinClass(classFile);
|
||||||
|
|||||||
@@ -16,18 +16,55 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.plugin.libraries;
|
package org.jetbrains.jet.plugin.libraries;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import com.intellij.AppTopics;
|
||||||
import com.intellij.lang.Language;
|
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.FileDocumentManager;
|
||||||
|
import com.intellij.openapi.fileEditor.FileDocumentManagerAdapter;
|
||||||
import com.intellij.openapi.fileTypes.ContentBasedClassFileProcessor;
|
import com.intellij.openapi.fileTypes.ContentBasedClassFileProcessor;
|
||||||
import com.intellij.openapi.fileTypes.SyntaxHighlighter;
|
import com.intellij.openapi.fileTypes.SyntaxHighlighter;
|
||||||
import com.intellij.openapi.project.DumbService;
|
import com.intellij.openapi.project.DumbService;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.openapi.vfs.VirtualFile;
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
|
import com.intellij.psi.impl.PsiDocumentManagerBase;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.plugin.highlighter.JetHighlighter;
|
import org.jetbrains.jet.plugin.highlighter.JetHighlighter;
|
||||||
|
|
||||||
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
public final class JetContentBasedFileSubstitutor implements ContentBasedClassFileProcessor {
|
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
|
@Override
|
||||||
public boolean isApplicable(@Nullable Project project, @NotNull final VirtualFile file) {
|
public boolean isApplicable(@Nullable Project project, @NotNull final VirtualFile file) {
|
||||||
@@ -53,8 +90,11 @@ public final class JetContentBasedFileSubstitutor implements ContentBasedClassFi
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public String obtainFileText(Project project, VirtualFile file) {
|
public String obtainFileText(Project project, VirtualFile file) {
|
||||||
if (DecompiledUtils.isKotlinCompiledFile(file)) {
|
if (file != null && DecompiledUtils.isKotlinCompiledFile(file)) {
|
||||||
return JetDecompiledData.getDecompiledData(file, project).getFileText();
|
JetDecompiledData data = JetDecompiledData.getDecompiledData(file, project);
|
||||||
|
deferredDocumentBinding.put(file, data.getFile());
|
||||||
|
|
||||||
|
return data.getFileText();
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user