diff options
Diffstat (limited to 'java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java')
-rw-r--r-- | java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java index 2569559d2d11..6ba88653749b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java @@ -21,21 +21,19 @@ package com.intellij.debugger.engine.evaluation.expression; import com.intellij.debugger.DebuggerBundle; +import com.intellij.debugger.engine.DebugProcess; import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.DebuggerUtils; import com.intellij.debugger.engine.JVMName; -import com.intellij.debugger.engine.evaluation.EvaluateException; -import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil; -import com.intellij.debugger.engine.evaluation.EvaluateRuntimeException; -import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; +import com.intellij.debugger.engine.evaluation.*; import com.intellij.debugger.impl.DebuggerUtilsEx; +import com.intellij.debugger.jdi.VirtualMachineProxyImpl; import com.intellij.openapi.diagnostic.Logger; -import com.sun.jdi.ClassType; -import com.sun.jdi.Method; -import com.sun.jdi.ObjectReference; -import com.sun.jdi.ReferenceType; +import com.intellij.rt.debugger.DefaultMethodInvoker; +import com.sun.jdi.*; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class MethodEvaluator implements Evaluator { @@ -149,7 +147,13 @@ public class MethodEvaluator implements Evaluator { if (requiresSuperObject) { return debugProcess.invokeInstanceMethod(context, objRef, jdiMethod, args, ObjectReference.INVOKE_NONVIRTUAL); } - return debugProcess.invokeMethod(context, objRef, jdiMethod, args); + // fix for default methods in interfaces, see IDEA-124066 + if (Boolean.valueOf(System.getProperty("debugger.invoke.default")) && jdiMethod.declaringType() instanceof InterfaceType) { + return invokeDefaultMethod(debugProcess, context, objRef, myMethodName); + } + else { + return debugProcess.invokeMethod(context, objRef, jdiMethod, args); + } } catch (Exception e) { if (LOG.isDebugEnabled()) { @@ -158,4 +162,22 @@ public class MethodEvaluator implements Evaluator { throw EvaluateExceptionUtil.createEvaluateException(e); } } + + // only methods without arguments for now + private static Value invokeDefaultMethod(DebugProcess debugProcess, EvaluationContext evaluationContext, + Value obj, String name) + throws EvaluateException, ClassNotLoadedException, InvalidTypeException { + ClassType invokerClass = (ClassType)debugProcess.findClass( + evaluationContext, DefaultMethodInvoker.class.getName(), + evaluationContext.getClassLoader()); + + if (invokerClass != null) { + List<Method> methods = invokerClass.methodsByName("invoke"); + if (!methods.isEmpty()) { + return debugProcess.invokeMethod(evaluationContext, invokerClass, methods.get(0), + Arrays.asList(obj, ((VirtualMachineProxyImpl)debugProcess.getVirtualMachineProxy()).mirrorOf(name))); + } + } + return null; + } } |