open anonymous classes inside the decompiled code

This commit is contained in:
Egor.Ushakov
2016-06-02 21:23:05 +03:00
parent 3604045a52
commit 0ace3c5330
2 changed files with 23 additions and 15 deletions

View File

@@ -26,14 +26,14 @@ import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory;
import com.intellij.openapi.editor.impl.EditorFactoryImpl;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.fileTypes.SyntaxHighlighter;
import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.DocumentUtil;
import javax.swing.*;
@@ -82,12 +82,11 @@ public class ByteCodeViewerComponent extends JPanel implements Disposable {
public void setText(final String bytecode, PsiElement element) {
int offset = 0;
PsiFile psiFile = element.getContainingFile();
final Document document = PsiDocumentManager.getInstance(element.getProject()).getDocument(psiFile);
if (document != null) {
int lineNumber = document.getLineNumber(element.getTextOffset());
VirtualFile file = psiFile.getVirtualFile();
if (file != null) {
VirtualFile file = PsiUtilCore.getVirtualFile(element);
if (file != null) {
final Document document = FileDocumentManager.getInstance().getDocument(file);
if (document != null) {
int lineNumber = document.getLineNumber(element.getTextOffset());
LineNumbersMapping mapping = file.getUserData(LineNumbersMapping.LINE_NUMBERS_MAPPING_KEY);
if (mapping != null) {
int mappedLine = mapping.sourceToBytecode(lineNumber);
@@ -98,10 +97,10 @@ public class ByteCodeViewerComponent extends JPanel implements Disposable {
lineNumber = mappedLine;
}
}
}
offset = bytecode.indexOf("LINENUMBER " + lineNumber);
while (offset == -1 && lineNumber < document.getLineCount()) {
offset = bytecode.indexOf("LINENUMBER " + (lineNumber++));
offset = bytecode.indexOf("LINENUMBER " + lineNumber);
while (offset == -1 && lineNumber < document.getLineCount()) {
offset = bytecode.indexOf("LINENUMBER " + (lineNumber++));
}
}
}
setText(bytecode, Math.max(0, offset));

View File

@@ -167,15 +167,24 @@ public class ShowByteCodeAction extends AnAction {
final PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, project);
final Editor injectedEditor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(editor, file);
if (injectedEditor != null) {
PsiFile psiFile = PsiUtilBase.getPsiFileInEditor(injectedEditor, project);
psiElement = psiFile != null ? psiFile.findElementAt(injectedEditor.getCaretModel().getOffset()) : null;
psiElement = findElementInFile(PsiUtilBase.getPsiFileInEditor(injectedEditor, project), injectedEditor);
}
if (file != null && psiElement == null) {
psiElement = file.findElementAt(editor.getCaretModel().getOffset());
psiElement = findElementInFile(file, editor);
}
}
return psiElement;
}
private static PsiElement findElementInFile(@Nullable PsiFile psiFile, Editor editor) {
if (psiFile == null) {
return null;
}
if (psiFile instanceof PsiCompiledFile) {
psiFile = ((PsiCompiledFile)psiFile).getDecompiledPsiFile();
}
return psiFile.findElementAt(editor.getCaretModel().getOffset());
}
}