public void handleIsolate(
      @NotNull final IsolateRef isolateRef, final boolean isolatePausedStart) {
    // We should auto-resume on a StartPaused event, if we're not remote debugging, and after
    // breakpoints have been set.

    final boolean newIsolate = myIsolatesInfo.addIsolate(isolateRef);

    if (isolatePausedStart) {
      myIsolatesInfo.setShouldInitialResume(isolateRef);
    }

    // Just to make sure that the main isolate is not handled twice, both from
    // handleDebuggerConnected() and DartVmServiceListener.received(PauseStart)
    if (newIsolate) {
      addRequest(
          () ->
              myVmService.setExceptionPauseMode(
                  isolateRef.getId(),
                  ExceptionPauseMode.Unhandled,
                  new VmServiceConsumers.SuccessConsumerWrapper() {
                    @Override
                    public void received(Success response) {
                      setInitialBreakpointsAndResume(isolateRef);
                    }
                  }));
    } else {
      checkInitialResume(isolateRef);
    }
  }
  private void doSetInitialBreakpointsAndResume(@NotNull final IsolateRef isolateRef) {
    final Set<XLineBreakpoint<XBreakpointProperties>> xBreakpoints =
        myBreakpointHandler.getXBreakpoints();

    if (xBreakpoints.isEmpty()) {
      myIsolatesInfo.setBreakpointsSet(isolateRef);
      checkInitialResume(isolateRef);
      return;
    }

    final AtomicInteger counter = new AtomicInteger(xBreakpoints.size());

    for (final XLineBreakpoint<XBreakpointProperties> xBreakpoint : xBreakpoints) {
      addBreakpoint(
          isolateRef.getId(),
          xBreakpoint.getSourcePosition(),
          new VmServiceConsumers.BreakpointConsumerWrapper() {
            @Override
            void sourcePositionNotApplicable() {
              checkDone();
            }

            @Override
            public void received(Breakpoint vmBreakpoint) {
              myBreakpointHandler.vmBreakpointAdded(xBreakpoint, isolateRef.getId(), vmBreakpoint);
              checkDone();
            }

            @Override
            public void onError(RPCError error) {
              myBreakpointHandler.breakpointFailed(xBreakpoint);
              checkDone();
            }

            private void checkDone() {
              if (counter.decrementAndGet() == 0) {
                myIsolatesInfo.setBreakpointsSet(isolateRef);
                checkInitialResume(isolateRef);
              }
            }
          });
    }
  }
 private void setInitialBreakpointsAndResume(@NotNull final IsolateRef isolateRef) {
   if (myDebugProcess.isRemoteDebug()) {
     if (myDebugProcess.myRemoteProjectRootUri == null) {
       // need to detect remote project root path before setting breakpoints
       getIsolate(
           isolateRef.getId(),
           new VmServiceConsumers.GetIsolateConsumerWrapper() {
             @Override
             public void received(final Isolate isolate) {
               myDebugProcess.guessRemoteProjectRoot(isolate.getLibraries());
               doSetInitialBreakpointsAndResume(isolateRef);
             }
           });
     } else {
       doSetInitialBreakpointsAndResume(isolateRef);
     }
   } else {
     doSetInitialBreakpointsAndResume(isolateRef);
   }
 }
 private void checkInitialResume(IsolateRef isolateRef) {
   if (myIsolatesInfo.getShouldInitialResume(isolateRef)) {
     resumeIsolate(isolateRef.getId(), null);
   }
 }