avoid UnsupportedOperation exceptions

This commit is contained in:
Eugene Zhuravlev
2013-11-02 00:28:39 +01:00
parent bbc6dbb0c6
commit fc45939459
3 changed files with 17 additions and 8 deletions
@@ -17,6 +17,7 @@ package com.intellij.debugger.engine;
import com.intellij.debugger.SourcePosition;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.jdi.VirtualMachineProxyImpl;
import com.intellij.psi.PsiCodeBlock;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLambdaExpression;
@@ -76,7 +77,8 @@ public class LambdaMethodFilter implements BreakpointStepMethodFilter{
}
public boolean locationMatches(DebugProcessImpl process, Location location) throws EvaluateException {
final VirtualMachineProxyImpl vm = process.getVirtualMachineProxy();
final Method method = location.method();
return method.name().startsWith(LAMBDA_METHOD_PREFIX) && method.isSynthetic();
return method.name().startsWith(LAMBDA_METHOD_PREFIX) && (!vm.canGetSyntheticAttribute() || method.isSynthetic());
}
}
@@ -286,6 +286,8 @@ public class PositionManagerImpl implements PositionManager {
return null;
}
final boolean canGetSynthetic = vmProxy.canGetSyntheticAttribute();
final boolean canReloadClasses = vmProxy.canRedefineClasses();
int rangeBegin = Integer.MAX_VALUE;
int rangeEnd = Integer.MIN_VALUE;
for (Location location : fromClass.allLineLocations()) {
@@ -294,8 +296,14 @@ public class PositionManagerImpl implements PositionManager {
continue; // should be a native method, skipping
}
final Method method = location.method();
if (method == null || method.isSynthetic() || method.isBridge() || method.isObsolete()) {
continue; // do not take into account synthetic stuff
try {
if (method == null || (canGetSynthetic && method.isSynthetic()) || method.isBridge() || (canReloadClasses && method.isObsolete())) {
// do not take into account synthetic stuff
continue;
}
}
catch (Throwable ignored) {
LOG.info(ignored);
}
final int locationLine = lnumber - 1;
rangeBegin = Math.min(rangeBegin, locationLine);
@@ -32,10 +32,7 @@ import com.intellij.debugger.engine.events.SuspendContextCommandImpl;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.impl.DebuggerSession;
import com.intellij.debugger.impl.DebuggerUtilsEx;
import com.intellij.debugger.jdi.LocalVariableProxyImpl;
import com.intellij.debugger.jdi.StackFrameProxyImpl;
import com.intellij.debugger.jdi.ThreadGroupReferenceProxyImpl;
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
import com.intellij.debugger.jdi.*;
import com.intellij.debugger.settings.NodeRendererSettings;
import com.intellij.debugger.settings.ThreadsViewSettings;
import com.intellij.debugger.ui.breakpoints.Breakpoint;
@@ -462,8 +459,10 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi
final ReferenceType thisRefType = thisObjectReference.referenceType();
if (thisRefType instanceof ClassType && thisRefType.equals(location.declaringType()) && thisRefType.name().contains("$")) { // makes sense for nested classes only
final ClassType clsType = (ClassType)thisRefType;
final DebugProcessImpl debugProcess = getDebuggerContext().getDebugProcess();
final VirtualMachineProxyImpl vm = debugProcess.getVirtualMachineProxy();
for (Field field : clsType.fields()) {
if (field.isSynthetic() && StringUtil.startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) {
if ((!vm.canGetSyntheticAttribute() || field.isSynthetic()) && StringUtil.startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) {
final FieldDescriptorImpl fieldDescriptor = myNodeManager.getFieldDescriptor(stackDescriptor, thisObjectReference, field);
myChildren.add(myNodeManager.createNode(fieldDescriptor, evaluationContext));
}