From fc45939459a107a6586ddd455da0edea9d11de12 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sat, 2 Nov 2013 00:26:14 +0100 Subject: [PATCH] avoid UnsupportedOperation exceptions --- .../intellij/debugger/engine/LambdaMethodFilter.java | 4 +++- .../debugger/engine/PositionManagerImpl.java | 12 ++++++++++-- .../debugger/ui/impl/watch/DebuggerTree.java | 9 ++++----- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/LambdaMethodFilter.java b/java/debugger/impl/src/com/intellij/debugger/engine/LambdaMethodFilter.java index 7e4fd940c772..32669347eb81 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/LambdaMethodFilter.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/LambdaMethodFilter.java @@ -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()); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java index 771444af0868..6b55b4029e00 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java @@ -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); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java index 32ace1064daf..39c2775df018 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java @@ -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)); }