private @Nullable VirtualFileSystemEntry doFindChild(@NotNull String name,
                                                       boolean ensureCanonicalName,
                                                       @NotNull NewVirtualFileSystem fs,
                                                       boolean isCaseSensitive) {
    if (name.isEmpty()) {
      return null;
    }
    if (!isValid()) {
      return handleInvalidDirectory(null);
    }

    VirtualFileSystemEntry found = doFindChildInArray(name, isCaseSensitive);
    if (found != null) return found;

    if (ensureCanonicalName) {
      String trimmedName = deSlash(name);
      if (trimmedName == null) return null;
      if (!trimmedName.equals(name)) {
        found = doFindChildInArray(trimmedName, isCaseSensitive);
        if (found != null) return found;
        name = trimmedName;
      }
    }

    if (allChildrenLoaded()) {
      return NULL_VIRTUAL_FILE;
    }

    return findInPersistence(name, ensureCanonicalName, fs, isCaseSensitive);
  }
private @Nullable VirtualFileSystemEntry doFindChild(@NotNull String name,
                                                       boolean ensureCanonicalName,
                                                       @NotNull NewVirtualFileSystem fs,
                                                       boolean isCaseSensitive)