From 85ed1695cdc9251d5bc33049899d9e87d2e968cc Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Thu, 17 Sep 2015 16:15:59 +0300 Subject: [PATCH] fixed lambdas args to slots mapping --- .../expression/EvaluatorBuilderImpl.java | 12 ++---------- .../expression/LocalVariableEvaluator.java | 17 ----------------- .../intellij/debugger/impl/DebuggerUtilsEx.java | 2 +- .../debugger/jdi/LocalVariablesUtil.java | 16 ++++++++++------ 4 files changed, 13 insertions(+), 34 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java index 2444cf51e48c..62f3e017a06d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java @@ -648,17 +648,9 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { final String localName = psiVar.getName(); PsiClass variableClass = getContainingClass(psiVar); if (getContextPsiClass() == null || getContextPsiClass().equals(variableClass)) { - PsiElement method = PsiTreeUtil.getContextOfType(expression, PsiMethod.class, PsiLambdaExpression.class); + PsiElement method = DebuggerUtilsEx.getContainingMethod(expression); boolean canScanFrames = method instanceof PsiLambdaExpression || ContextUtil.isJspImplicit(element); - LocalVariableEvaluator localVarEvaluator = new LocalVariableEvaluator(localName, canScanFrames); - if (psiVar instanceof PsiParameter) { - final PsiParameter param = (PsiParameter)psiVar; - final PsiParameterList paramList = PsiTreeUtil.getParentOfType(param, PsiParameterList.class, true); - if (paramList != null) { - localVarEvaluator.setParameterIndex(paramList.getParameterIndex(param)); - } - } - myResult = localVarEvaluator; + myResult = new LocalVariableEvaluator(localName, canScanFrames); return; } // the expression references final var outside the context's class (in some of the outer classes) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/LocalVariableEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/LocalVariableEvaluator.java index 13106ffc8eab..87a958286a5a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/LocalVariableEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/LocalVariableEvaluator.java @@ -42,7 +42,6 @@ import com.intellij.psi.PsiVariable; import com.sun.jdi.*; import org.jetbrains.annotations.Nullable; -import java.util.List; import java.util.Map; class LocalVariableEvaluator implements Evaluator { @@ -52,17 +51,12 @@ class LocalVariableEvaluator implements Evaluator { private EvaluationContextImpl myContext; private LocalVariableProxyImpl myEvaluatedVariable; private final boolean myCanScanFrames; - private int myParameterIndex = -1; public LocalVariableEvaluator(String localVariableName, boolean canScanFrames) { myLocalVariableName = localVariableName; myCanScanFrames = canScanFrames; } - public void setParameterIndex(int parameterIndex) { - myParameterIndex = parameterIndex; - } - @Override public Object evaluate(EvaluationContextImpl context) throws EvaluateException { StackFrameProxyImpl frameProxy = context.getFrameProxy(); @@ -108,17 +102,6 @@ class LocalVariableEvaluator implements Evaluator { catch (Exception e1) { LOG.info(e1); } - - if (topFrame) { - if (myParameterIndex < 0) { - throw e; - } - final List values = frameProxy.getArgumentValues(); - if (values.isEmpty() || myParameterIndex >= values.size()) { - throw e; - } - return values.get(myParameterIndex); - } } if (myCanScanFrames) { diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java index b5db5d5f2781..c9c48e5b8c56 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java @@ -868,7 +868,7 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils { @Nullable public static PsiElement getContainingMethod(@Nullable PsiElement elem) { - return PsiTreeUtil.getParentOfType(elem, PsiMethod.class, PsiLambdaExpression.class); + return PsiTreeUtil.getContextOfType(elem, PsiMethod.class, PsiLambdaExpression.class); } @Nullable diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java b/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java index f5757974ae46..ceca5d5f50df 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java @@ -119,15 +119,17 @@ public class LocalVariablesUtil { ourInitializationOk = success; } - public static Map fetchValues(StackFrameProxyImpl frameProxy, DebugProcess process) throws Exception { + public static Map fetchValues(@NotNull StackFrameProxyImpl frameProxy, DebugProcess process) throws Exception { Map map = new LinkedHashMap(); // LinkedHashMap for correct order + List argValues = frameProxy.getArgumentValues(); + // gather code variables names - MultiMap namesMap = calcNames(new SimpleStackFrameContext(frameProxy, process)); + MultiMap namesMap = calcNames(new SimpleStackFrameContext(frameProxy, process), argValues.size()); // first add arguments int slot = 0; - for (Value value : frameProxy.getArgumentValues()) { + for (Value value : argValues) { map.put(new DecompiledLocalVariable(slot, true, null, namesMap.get(slot)), value); slot++; } @@ -258,7 +260,7 @@ public class LocalVariablesUtil { } @NotNull - private static MultiMap calcNames(@NotNull final StackFrameContext context) { + private static MultiMap calcNames(@NotNull final StackFrameContext context, final int methodArgsNumber) { return ApplicationManager.getApplication().runReadAction(new Computable>() { @Override public MultiMap compute() { @@ -269,8 +271,10 @@ public class LocalVariablesUtil { PsiParameterList params = DebuggerUtilsEx.getParameterList(method); if (params != null) { MultiMap res = new MultiMap(); - for (int i = 0; i < params.getParametersCount(); i++) { - res.putValue(i, params.getParameters()[i].getName()); + int paramCount = params.getParametersCount(); + int offset = Math.max(0, methodArgsNumber - paramCount); + for (int i = 0; i < paramCount; i++) { + res.putValue(i + offset, params.getParameters()[i].getName()); } PsiElement body = DebuggerUtilsEx.getBody(method); if (body != null) {