@Override
  public void evaluate(@NotNull final XExpression expression,
                       @NotNull final XEvaluationCallback baseCallback,
                       @Nullable XSourcePosition expressionPosition) {
    myDebugProcess.getManagerThread().schedule(new DebuggerContextCommandImpl(myDebugProcess.getDebuggerContext(),
                                                                              myStackFrame.getStackFrameProxy().threadProxy()) {
      @Override
      public Priority getPriority() {
        return Priority.NORMAL;
      }

      @Override
      public void threadAction(@NotNull SuspendContextImpl suspendContext) {
        ReportingEvaluationCallback callback = wrapToReportingCallback(baseCallback, myDebugProcess.getProject());
        WatchItemDescriptor descriptor = null;
        try {
          if (DebuggerUIUtil.isObsolete(callback)) {
            return;
          }

          JavaDebugProcess process = myDebugProcess.getXdebugProcess();
          if (process == null) {
            callback.errorOccurred(JavaDebuggerBundle.message("error.no.debug.process"), descriptor);
            return;
          }
          TextWithImports text = TextWithImportsImpl.fromXExpression(expression);
          NodeManagerImpl nodeManager = process.getNodeManager();
          descriptor = nodeManager.getWatchItemDescriptor(null, text, null);
          EvaluationContextImpl evalContext = myStackFrame.getFrameDebuggerContext(getDebuggerContext()).createEvaluationContext();
          if (evalContext == null) {
            callback.errorOccurred(JavaDebuggerBundle.message("error.context.not.available"), descriptor);
            return;
          }
          descriptor.setContext(evalContext);
          EvaluateException exception = descriptor.getEvaluateException();
          if (exception != null && descriptor.getValue() == null) {
            callback.errorOccurred(exception.getMessage(), descriptor);
            return;
          }
          callback.evaluated(JavaValue.create(null, descriptor, evalContext, nodeManager, true));
        }
        catch (Throwable e) {
          callback.errorOccurred(JavaDebuggerBundle.message("error.internal"), descriptor);
          throw e;
        }
      }
    });
  }
@Override
  public void evaluate(@NotNull final XExpression expression,
                       @NotNull final XEvaluationCallback baseCallback,
                       @Nullable XSourcePosition expressionPosition)