diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/ToggleFieldBreakpointAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/ToggleFieldBreakpointAction.java index 54d1545f74f6..39a397755a5e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/ToggleFieldBreakpointAction.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/ToggleFieldBreakpointAction.java @@ -19,8 +19,11 @@ import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.InstanceFilter; import com.intellij.debugger.SourcePosition; +import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.DebuggerUtils; +import com.intellij.debugger.engine.events.DebuggerContextCommandImpl; import com.intellij.debugger.engine.requests.RequestManagerImpl; +import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.impl.DebuggerSession; import com.intellij.debugger.ui.breakpoints.Breakpoint; import com.intellij.debugger.ui.breakpoints.BreakpointManager; @@ -29,12 +32,14 @@ import com.intellij.debugger.ui.impl.watch.DebuggerTree; import com.intellij.debugger.ui.impl.watch.DebuggerTreeNodeImpl; import com.intellij.debugger.ui.impl.watch.FieldDescriptorImpl; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -83,7 +88,10 @@ public class ToggleFieldBreakpointAction extends AnAction { RequestManagerImpl.createRequests(fieldBreakpoint); - manager.editBreakpoint(fieldBreakpoint, CommonDataKeys.EDITOR.getData(e.getDataContext())); + final Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext()); + if (editor != null) { + manager.editBreakpoint(fieldBreakpoint, editor); + } } } else { @@ -126,7 +134,7 @@ public class ToggleFieldBreakpointAction extends AnAction { @Nullable public static SourcePosition getPlace(AnActionEvent event) { final DataContext dataContext = event.getDataContext(); - Project project = event.getData(CommonDataKeys.PROJECT); + final Project project = event.getData(CommonDataKeys.PROJECT); if(project == null) { return null; } @@ -142,8 +150,28 @@ public class ToggleFieldBreakpointAction extends AnAction { final DebuggerTreeNodeImpl selectedNode = DebuggerAction.getSelectedNode(dataContext); if(selectedNode != null && selectedNode.getDescriptor() instanceof FieldDescriptorImpl) { - FieldDescriptorImpl descriptor = (FieldDescriptorImpl)selectedNode.getDescriptor(); - return descriptor.getSourcePosition(project, DebuggerAction.getDebuggerContext(dataContext)); + final DebuggerContextImpl debuggerContext = DebuggerAction.getDebuggerContext(dataContext); + final DebugProcessImpl debugProcess = debuggerContext.getDebugProcess(); + if (debugProcess != null) { // if there is an active debugsession + final Ref positionRef = new Ref(null); + debugProcess.getManagerThread().invokeAndWait(new DebuggerContextCommandImpl(debuggerContext) { + public Priority getPriority() { + return Priority.HIGH; + } + public void threadAction() { + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + final FieldDescriptorImpl descriptor = (FieldDescriptorImpl)selectedNode.getDescriptor(); + positionRef.set(descriptor.getSourcePosition(project, debuggerContext)); + } + }); + } + }); + final SourcePosition sourcePosition = positionRef.get(); + if (sourcePosition != null) { + return sourcePosition; + } + } } if(DebuggerAction.isContextView(event)) { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java index 598679da92fc..4b3f145995b2 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java @@ -25,7 +25,6 @@ import com.intellij.debugger.engine.JVMNameUtil; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; -import com.intellij.debugger.engine.events.DebuggerContextCommandImpl; import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.impl.DebuggerSession; import com.intellij.debugger.impl.PositionUtil; @@ -33,10 +32,7 @@ import com.intellij.debugger.settings.NodeRendererSettings; import com.intellij.debugger.ui.tree.FieldDescriptor; import com.intellij.debugger.ui.tree.NodeDescriptor; import com.intellij.debugger.ui.tree.render.ClassRenderer; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -105,44 +101,20 @@ public class FieldDescriptorImpl extends ValueDescriptorImpl implements FieldDes // trying to search, assuming declaring class is an anonymous class final DebugProcessImpl debugProcess = context.getDebugProcess(); if (debugProcess != null) { - final Computable classComputable = new Computable() { - public PsiClass compute() { - try { - final List locations = type.allLineLocations(); - if (!locations.isEmpty()) { - // important: use the last location to be sure the position will be within the anonymous class - final Location lastLocation = locations.get(locations.size() - 1); - final SourcePosition position = debugProcess.getPositionManager().getSourcePosition(lastLocation); - if (position != null) { - return JVMNameUtil.getClassAt(position); - } - } + try { + final List locations = type.allLineLocations(); + if (!locations.isEmpty()) { + // important: use the last location to be sure the position will be within the anonymous class + final Location lastLocation = locations.get(locations.size() - 1); + final SourcePosition position = debugProcess.getPositionManager().getSourcePosition(lastLocation); + if (position != null) { + aClass = JVMNameUtil.getClassAt(position); } - catch (AbsentInformationException ignored) { - } - catch (ClassNotPreparedException ignored) { - } - return null; } - }; - if (!DebuggerManagerThreadImpl.isManagerThread()) { - final Ref classRef = new Ref(null); - debugProcess.getManagerThread().invokeAndWait(new DebuggerContextCommandImpl(context) { - public Priority getPriority() { - return Priority.HIGH; - } - public void threadAction() { - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - classRef.set(classComputable.compute()); - } - }); - } - }); - aClass = classRef.get(); } - else { - aClass = classComputable.compute(); + catch (AbsentInformationException ignored) { + } + catch (ClassNotPreparedException ignored) { } } }