closeOpenFile(info, skipAssignOrphanScriptInfosToInferredProject) {
    const fileExists = info.isDynamic ? false : this.host.fileExists(info.fileName);
    info.close(fileExists);
    this.stopWatchingConfigFilesForClosedScriptInfo(info);
    const canonicalFileName = this.toCanonicalFileName(info.fileName);
    if (this.openFilesWithNonRootedDiskPath.get(canonicalFileName) === info) {
      this.openFilesWithNonRootedDiskPath.delete(canonicalFileName);
    }
    let ensureProjectsForOpenFiles = false;
    for (const p of info.containingProjects) {
      if (isConfiguredProject(p)) {
        if (info.hasMixedContent) {
          info.registerFileUpdate();
        }
        const reloadLevel = p.openFileWatchTriggered.get(info.path);
        if (reloadLevel !== void 0) {
          p.openFileWatchTriggered.delete(info.path);
          if (p.pendingReload !== void 0 && p.pendingReload < reloadLevel) {
            p.pendingReload = reloadLevel;
            p.markFileAsDirty(info.path);
          }
        }
      } else if (isInferredProject(p) && p.isRoot(info)) {
        if (p.isProjectWithSingleRoot()) {
          ensureProjectsForOpenFiles = true;
        }
        p.removeFile(
          info,
          fileExists,
          /*detachFromProject*/
          true
        );
      }
      if (!p.languageServiceEnabled) {
        p.markAsDirty();
      }
    }
    this.openFiles.delete(info.path);
    this.configFileForOpenFiles.delete(info.path);
    if (!skipAssignOrphanScriptInfosToInferredProject && ensureProjectsForOpenFiles) {
      this.assignOrphanScriptInfosToInferredProject();
    }
    if (fileExists) {
      this.watchClosedScriptInfo(info);
    } else {
      this.handleDeletedFile(info);
    }
    return ensureProjectsForOpenFiles;
  }
Remove this file from the set of open, non-configured files.
@param info The file that has been closed or newly configured