IDEA-156664 Incorrect alternative source

This commit is contained in:
Egor.Ushakov
2016-05-26 15:40:48 +03:00
parent 9ce33254f6
commit be8dbe4122
@@ -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<ComboBoxClassElement> 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);
}
});
}