"read access" assertion and NPE fixes

This commit is contained in:
Eugene Zhuravlev
2013-11-29 15:21:03 +01:00
parent 77ed2ca36c
commit dfacab8eb8
2 changed files with 43 additions and 43 deletions
@@ -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<SourcePosition> positionRef = new Ref<SourcePosition>(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)) {
@@ -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<PsiClass> classComputable = new Computable<PsiClass>() {
public PsiClass compute() {
try {
final List<Location> 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<Location> 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<PsiClass> classRef = new Ref<PsiClass>(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) {
}
}
}