@Override
  protected String calcRepresentation(EvaluationContextImpl context, DescriptorLabelListener labelListener) {
    DebuggerManagerThreadImpl.assertIsManagerThread();

    DebugProcessImpl debugProcess = context.getDebugProcess();
    getRenderer(debugProcess)
      .thenAccept(renderer -> calcRepresentation(context, labelListener, debugProcess, renderer))
      .exceptionally(throwable -> {
        throwable = DebuggerUtilsAsync.unwrap(throwable);
        if (throwable instanceof EvaluateException) {
          setValueLabelFailed((EvaluateException)throwable);
        }
        else {
          String message;
          if (throwable instanceof CancellationException) {
            message = JavaDebuggerBundle.message("error.context.has.changed");
          }
          else if (throwable instanceof VMDisconnectedException || throwable instanceof RejectedExecutionException) {
            message = JavaDebuggerBundle.message("error.vm.disconnected");
          }
          else {
            message = JavaDebuggerBundle.message("internal.debugger.error");
            LOG.error(new Throwable(throwable));
          }
          setValueLabelFailed(new EvaluateException(message));
        }
        labelListener.labelChanged();
        return null;
      });

    return "";
  }
@Override
  protected String calcRepresentation(EvaluationContextImpl context, DescriptorLabelListener labelListener)