From 0ace3c53306e11df893878918f38b46ecf8557f7 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Thu, 2 Jun 2016 21:23:05 +0300 Subject: [PATCH] open anonymous classes inside the decompiled code --- .../ByteCodeViewerComponent.java | 23 +++++++++---------- .../byteCodeViewer/ShowByteCodeAction.java | 15 +++++++++--- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/plugins/ByteCodeViewer/src/com/intellij/byteCodeViewer/ByteCodeViewerComponent.java b/plugins/ByteCodeViewer/src/com/intellij/byteCodeViewer/ByteCodeViewerComponent.java index 060569cea65c..3eda067a64b4 100644 --- a/plugins/ByteCodeViewer/src/com/intellij/byteCodeViewer/ByteCodeViewerComponent.java +++ b/plugins/ByteCodeViewer/src/com/intellij/byteCodeViewer/ByteCodeViewerComponent.java @@ -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)); diff --git a/plugins/ByteCodeViewer/src/com/intellij/byteCodeViewer/ShowByteCodeAction.java b/plugins/ByteCodeViewer/src/com/intellij/byteCodeViewer/ShowByteCodeAction.java index bb2b9c13ee3a..1b65ea992c97 100644 --- a/plugins/ByteCodeViewer/src/com/intellij/byteCodeViewer/ShowByteCodeAction.java +++ b/plugins/ByteCodeViewer/src/com/intellij/byteCodeViewer/ShowByteCodeAction.java @@ -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()); + } }