autoboxing support for debugger evaluators: method calls (IDEA-36597)
authorEugene Zhuravlev <jeka@intellij.com>
Tue, 9 Feb 2010 18:14:23 +0000 (9 21:14 +0300)
committerEugene Zhuravlev <jeka@intellij.com>
Fri, 12 Feb 2010 16:30:48 +0000 (12 19:30 +0300)
java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java
java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java

index 6620092..c05df21 100644 (file)
@@ -918,7 +918,13 @@ public abstract class DebugProcessImpl implements DebugProcess {
             return invokeMethodAndFork(suspendContext);
             }
           catch (ClassNotLoadedException e) {
-            ReferenceType loadedClass = evaluationContext.isAutoLoadClasses()? loadClass(evaluationContext, e.className(), evaluationContext.getClassLoader()) : null;
+            ReferenceType loadedClass = null;
+            try {
+              loadedClass = evaluationContext.isAutoLoadClasses()? loadClass(evaluationContext, e.className(), evaluationContext.getClassLoader()) : null;
+            }
+            catch (EvaluateException ignored) {
+              loadedClass = null;
+            }
             if (loadedClass == null) {
               throw EvaluateExceptionUtil.createEvaluateException(e);
             }
index f3f1b3d..57aead7 100644 (file)
@@ -798,6 +798,19 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder {
         }
       }
 
+      if (psiMethod != null) {
+        // handle autoboxing
+        for (int i = 0, parametersLength = psiMethod.getParameterList().getParameters().length; i < parametersLength; i++) {
+          PsiParameter parameter = psiMethod.getParameterList().getParameters()[i];
+          final PsiType paramType = parameter.getType();
+          final PsiType realArgType = argExpressions[i].getType();
+          if (TypeConversionUtil.boxingConversionApplicable(paramType, realArgType)) {
+            final Evaluator argEval = argumentEvaluators.get(i);
+            argumentEvaluators.set(i, (paramType instanceof PsiPrimitiveType)? new UnBoxingEvaluator(argEval) : new BoxingEvaluator(argEval));
+          }
+        }
+      }
+
       myResult = new MethodEvaluator(objectEvaluator, contextClass, methodExpr.getReferenceName(), psiMethod != null ? JVMNameUtil.getJVMSignature(psiMethod) : null, argumentEvaluators);
     }