updateErrorCheck(next, checkList, ms, requireOpen = true) {
    Debug.assert(!this.suppressDiagnosticEvents);
    const seq = this.changeSeq;
    const followMs = Math.min(ms, 200);
    let index = 0;
    const goNext = () => {
      index++;
      if (checkList.length > index) {
        next.delay(followMs, checkOne);
      }
    };
    const checkOne = () => {
      if (this.changeSeq !== seq) {
        return;
      }
      let item = checkList[index];
      if (isString(item)) {
        item = this.toPendingErrorCheck(item);
        if (!item) {
          goNext();
          return;
        }
      }
      const { fileName, project } = item;
      updateProjectIfDirty(project);
      if (!project.containsFile(fileName, requireOpen)) {
        return;
      }
      this.syntacticCheck(fileName, project);
      if (this.changeSeq !== seq) {
        return;
      }
      if (project.projectService.serverMode !== 0 /* Semantic */) {
        goNext();
        return;
      }
      next.immediate(() => {
        this.semanticCheck(fileName, project);
        if (this.changeSeq !== seq) {
          return;
        }
        if (this.getPreferences(fileName).disableSuggestions) {
          goNext();
          return;
        }
        next.immediate(() => {
          this.suggestionCheck(fileName, project);
          goNext();
        });
      });
    };
    if (checkList.length > index && this.changeSeq === seq) {
      next.delay(ms, checkOne);
    }
  }
It is the caller's responsibility to verify that `!this.suppressDiagnosticEvents`.