IDEA-85878 Expression Evaluation - IDEA should already know packages
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 28 Jul 2015 18:14:31 +0000 (21:14 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 28 Jul 2015 18:15:53 +0000 (21:15 +0300)
java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java
java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTreeNodeExpression.java

index 3026a3852856911067945edc49bfc5962ed79421..a78076b790649d7ca757228abf558ddf0acb18df 100644 (file)
@@ -47,6 +47,7 @@ import com.intellij.xdebugger.evaluation.XDebuggerEvaluator;
 import com.intellij.xdebugger.evaluation.XInstanceEvaluator;
 import com.intellij.xdebugger.frame.*;
 import com.intellij.xdebugger.frame.presentation.XValuePresentation;
+import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl;
 import com.intellij.xdebugger.impl.evaluate.XValueCompactPresentation;
 import com.intellij.xdebugger.impl.ui.XValueTextProvider;
 import com.intellij.xdebugger.impl.ui.tree.XValueExtendedPresentation;
@@ -62,6 +63,7 @@ import org.jetbrains.concurrency.Promise;
 import javax.swing.*;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 /**
 * @author egor
@@ -525,7 +527,16 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XV
               try {
                 PsiExpression psiExpression = getDescriptor().getTreeEvaluation(JavaValue.this, getDebuggerContext());
                 if (psiExpression != null) {
-                  return TextWithImportsImpl.toXExpression(new TextWithImportsImpl(psiExpression));
+                  XExpression res = TextWithImportsImpl.toXExpression(new TextWithImportsImpl(psiExpression));
+                  // add runtime imports if any
+                  Set<String> imports = psiExpression.getUserData(DebuggerTreeNodeExpression.ADDITIONAL_IMPORTS_KEY);
+                  if (imports != null && res != null) {
+                    if (res.getCustomInfo() != null) {
+                      imports.add(res.getCustomInfo());
+                    }
+                    res = new XExpressionImpl(res.getExpression(), res.getLanguage(), StringUtil.join(imports, ","), res.getMode());
+                  }
+                  return res;
                 }
               }
               catch (EvaluateException e) {
index df04d5a53eff58f9716b81038eacc076daf1fe9f..17628f12eb215e4bef02fe30a3a0c64484c88d1c 100644 (file)
@@ -25,17 +25,21 @@ import com.intellij.debugger.impl.DebuggerContextImpl;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Computable;
+import com.intellij.openapi.util.Key;
 import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.*;
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.psi.util.PsiUtil;
 import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.containers.SmartHashSet;
 import com.sun.jdi.ObjectReference;
 import com.sun.jdi.ReferenceType;
 import com.sun.jdi.Value;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.Set;
+
 /**
  * User: lex
  * Date: Oct 29, 2003
@@ -177,7 +181,7 @@ public class DebuggerTreeNodeExpression {
     }
 
     if (castNeeded) {
-      howToEvaluateThis = castToRuntimeType(howToEvaluateThis, howToEvaluateThisValue, howToEvaluateThis.getContext());
+      howToEvaluateThis = castToRuntimeType(howToEvaluateThis, howToEvaluateThisValue);
     }
 
     ChangeContextUtil.encodeContextInfo(result, false);
@@ -191,15 +195,19 @@ public class DebuggerTreeNodeExpression {
     }
 
     try {
-      return JavaPsiFacade.getInstance(howToEvaluateThis.getProject()).getElementFactory()
+      PsiExpression res = JavaPsiFacade.getInstance(howToEvaluateThis.getProject()).getElementFactory()
         .createExpressionFromText(psiExpression.getText(), howToEvaluateThis.getContext());
+      res.putUserData(ADDITIONAL_IMPORTS_KEY, howToEvaluateThis.getUserData(ADDITIONAL_IMPORTS_KEY));
+      return res;
     }
     catch (IncorrectOperationException e) {
       throw new EvaluateException(e.getMessage(), e);
     }
   }
 
-  public static PsiExpression castToRuntimeType(PsiExpression expression, Value value, PsiElement contextElement) throws EvaluateException {
+  public static final Key<Set<String>> ADDITIONAL_IMPORTS_KEY = Key.create("ADDITIONAL_IMPORTS");
+
+  public static PsiExpression castToRuntimeType(PsiExpression expression, Value value) throws EvaluateException {
     if (!(value instanceof ObjectReference)) {
       return expression;
     }
@@ -217,14 +225,21 @@ public class DebuggerTreeNodeExpression {
     }
 
     PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project);
+    String typeName = type.getQualifiedName();
     try {
       PsiParenthesizedExpression parenthExpression = (PsiParenthesizedExpression)elementFactory.createExpressionFromText(
-        "((" + type.getQualifiedName() + ")expression)", null);
+        "((" + typeName + ")expression)", null);
       ((PsiTypeCastExpression)parenthExpression.getExpression()).getOperand().replace(expression);
+      Set<String> imports = expression.getUserData(ADDITIONAL_IMPORTS_KEY);
+      if (imports == null) {
+        imports = new SmartHashSet<String>();
+      }
+      imports.add(typeName);
+      parenthExpression.putUserData(ADDITIONAL_IMPORTS_KEY, imports);
       return parenthExpression;
     }
     catch (IncorrectOperationException e) {
-      throw new EvaluateException(DebuggerBundle.message("error.invalid.type.name", type.getQualifiedName()), e);
+      throw new EvaluateException(DebuggerBundle.message("error.invalid.type.name", typeName), e);
     }
   }