public static CompletableFuture<StackFrameDescriptorImpl> createAsync(@NotNull StackFrameProxyImpl frame,
                                                                        @NotNull MethodsTracker tracker) {
    return frame.locationAsync()
      .thenCompose(DebuggerUtilsAsync::method)
      .thenCombine(DebuggerUtilsAsync.reschedule(getSourcePositionAsync(frame)), (method, position) -> {
        DebuggerManagerThreadImpl.assertIsManagerThread();
        return new StackFrameDescriptorImpl(frame, true, method, tracker, position);
      })
      .exceptionally(throwable -> {
        Throwable exception = DebuggerUtilsAsync.unwrap(throwable);
        if (exception instanceof EvaluateException) {
          // TODO: simplify when only async method left
          if (!(exception.getCause() instanceof InvalidStackFrameException)) {
            LOG.error(new Exception(exception));
          }
          DebuggerManagerThreadImpl.assertIsManagerThread();
          return new StackFrameDescriptorImpl(frame, tracker); // fallback to sync
        }
        throw (RuntimeException)throwable;
      });
  }
public static CompletableFuture<StackFrameDescriptorImpl> createAsync(@NotNull StackFrameProxyImpl frame,
                                                                        @NotNull MethodsTracker tracker)