From be8dbe4122b3aa97312dccc2da700c0af55b4b50 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Thu, 26 May 2016 15:31:35 +0300 Subject: [PATCH] IDEA-156664 Incorrect alternative source --- ...AlternativeSourceNotificationProvider.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/AlternativeSourceNotificationProvider.java b/java/debugger/impl/src/com/intellij/debugger/ui/AlternativeSourceNotificationProvider.java index d54aae1149a5..70cd0120a146 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/AlternativeSourceNotificationProvider.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/AlternativeSourceNotificationProvider.java @@ -17,11 +17,11 @@ package com.intellij.debugger.ui; import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.DebuggerManagerEx; +import com.intellij.debugger.engine.JavaStackFrame; import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.impl.DebuggerSession; import com.intellij.debugger.impl.DebuggerUtilsEx; -import com.intellij.debugger.jdi.StackFrameProxyImpl; import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.ide.util.ModuleRendererFactory; import com.intellij.openapi.fileEditor.FileEditor; @@ -30,17 +30,18 @@ import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.ui.EditorNotificationPanel; import com.intellij.ui.EditorNotifications; import com.intellij.ui.components.JBList; -import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.XSourcePosition; +import com.intellij.xdebugger.frame.XStackFrame; import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import com.sun.jdi.Location; import org.jetbrains.annotations.NotNull; @@ -121,7 +122,16 @@ public class AlternativeSourceNotificationProvider extends EditorNotifications.P ComboBoxClassElement.class, psiClass -> new ComboBoxClassElement((PsiClass)psiClass.getNavigationElement())); - return new AlternativeSourceNotificationPanel(elems, baseClass, myProject, file); + String locationDeclName = null; + XStackFrame frame = session.getCurrentStackFrame(); + if (frame instanceof JavaStackFrame) { + Location location = ((JavaStackFrame)frame).getDescriptor().getLocation(); + if (location != null) { + locationDeclName = location.declaringType().name(); + } + } + + return new AlternativeSourceNotificationPanel(elems, baseClass, myProject, file, locationDeclName); } return null; } @@ -156,9 +166,10 @@ public class AlternativeSourceNotificationProvider extends EditorNotifications.P public AlternativeSourceNotificationPanel(ComboBoxClassElement[] alternatives, final PsiClass aClass, final Project project, - final VirtualFile file) { + final VirtualFile file, + String locationDeclName) { setText(DebuggerBundle.message("editor.notification.alternative.source", aClass.getQualifiedName())); - final ComboBox switcher = new ComboBox(alternatives); + final ComboBox switcher = new ComboBox<>(alternatives); switcher.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -170,10 +181,8 @@ public class AlternativeSourceNotificationProvider extends EditorNotifications.P session.getProcess().getManagerThread().schedule(new DebuggerCommandImpl() { @Override protected void action() throws Exception { - StackFrameProxyImpl proxy = context.getFrameProxy(); - Location location = proxy != null ? proxy.location() : null; - if (location != null) { - DebuggerUtilsEx.setAlternativeSourceUrl(location.declaringType().name(), vFile.getUrl(), project); + if (!StringUtil.isEmpty(locationDeclName)) { + DebuggerUtilsEx.setAlternativeSourceUrl(locationDeclName, vFile.getUrl(), project); } DebuggerUIUtil.invokeLater(() -> { FileEditorManager.getInstance(project).closeFile(file); @@ -195,7 +204,7 @@ public class AlternativeSourceNotificationProvider extends EditorNotifications.P FileEditorManager fileEditorManager = FileEditorManager.getInstance(project); FileEditor editor = fileEditorManager.getSelectedEditor(file); if (editor != null) { - fileEditorManager.removeTopComponent(editor, AlternativeSourceNotificationPanel.this); + fileEditorManager.removeTopComponent(editor, this); } }); }