IDEA-126257 JDK 1.8: Debugger doesn't show variables *outside* lambda clion/142.3997
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Thu, 13 Aug 2015 17:50:55 +0000 (20:50 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Thu, 13 Aug 2015 17:52:06 +0000 (20:52 +0300)
java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/LocalVariableEvaluator.java

index caf0e41c07c38024cf1654ef229a7a58bcd852de..2fc76a81c778e7f1b386d29de19bd2289a3f78d2 100644 (file)
@@ -21,6 +21,7 @@
 package com.intellij.debugger.engine.evaluation.expression;
 
 import com.intellij.debugger.DebuggerBundle;
 package com.intellij.debugger.engine.evaluation.expression;
 
 import com.intellij.debugger.DebuggerBundle;
+import com.intellij.debugger.engine.LambdaMethodFilter;
 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.evaluation.EvaluateException;
 import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil;
 import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
@@ -64,6 +65,8 @@ class LocalVariableEvaluator implements Evaluator {
       ThreadReferenceProxyImpl threadProxy = null;
       int lastFrameIndex = -1;
 
       ThreadReferenceProxyImpl threadProxy = null;
       int lastFrameIndex = -1;
 
+      boolean anotherFrame = false;
+
       while (true) {
         try {
           LocalVariableProxyImpl local = frameProxy.visibleVariableByName(myLocalVariableName);
       while (true) {
         try {
           LocalVariableProxyImpl local = frameProxy.visibleVariableByName(myLocalVariableName);
@@ -77,25 +80,30 @@ class LocalVariableEvaluator implements Evaluator {
           if (!(e.getCause() instanceof AbsentInformationException)) {
             throw e;
           }
           if (!(e.getCause() instanceof AbsentInformationException)) {
             throw e;
           }
-          if (myParameterIndex < 0) {
-            throw e;
-          }
-          final List<Value> values = frameProxy.getArgumentValues();
-          if (values.isEmpty() || myParameterIndex >= values.size()) {
-            throw e;
+          if (!anotherFrame) {
+            if (myParameterIndex < 0) {
+              throw e;
+            }
+            final List<Value> values = frameProxy.getArgumentValues();
+            if (values.isEmpty() || myParameterIndex >= values.size()) {
+              throw e;
+            }
+            return values.get(myParameterIndex);
           }
           }
-          return values.get(myParameterIndex);
         }
 
         }
 
-        if (myIsJspSpecial) {
+        if (anotherFrame || needToSwitchFrames(frameProxy)) {
           if (threadProxy == null /* initialize it lazily */) {
             threadProxy = frameProxy.threadProxy();
             lastFrameIndex = threadProxy.frameCount() - 1;
           }
           if (threadProxy == null /* initialize it lazily */) {
             threadProxy = frameProxy.threadProxy();
             lastFrameIndex = threadProxy.frameCount() - 1;
           }
-          final int currentFrameIndex = frameProxy.getFrameIndex();
+          int currentFrameIndex = frameProxy.getFrameIndex();
           if (currentFrameIndex < lastFrameIndex) {
             frameProxy = threadProxy.frame(currentFrameIndex + 1);
           if (currentFrameIndex < lastFrameIndex) {
             frameProxy = threadProxy.frame(currentFrameIndex + 1);
-            continue;
+            if (frameProxy != null) {
+              anotherFrame = true;
+              continue;
+            }
           }
         }
 
           }
         }
 
@@ -110,6 +118,17 @@ class LocalVariableEvaluator implements Evaluator {
     }
   }
 
     }
   }
 
+  private boolean needToSwitchFrames(StackFrameProxyImpl frameProxy) {
+    if (myIsJspSpecial) return true;
+    try {
+      Location location = frameProxy.location();
+      if (location == null) return false;
+      return LambdaMethodFilter.isLambdaName(location.method().name());
+    }
+    catch (EvaluateException ignored) {}
+    return false;
+  }
+
   @Override
   public Modifier getModifier() {
     Modifier modifier = null;
   @Override
   public Modifier getModifier() {
     Modifier modifier = null;