void addMapping(@NotNull Collection<? extends Pair<String, String>> mapping) {
    for (var pair : mapping) {
      var from = pair.first;
      var to = pair.second;

      // See if we are adding a mapping that itself should be mapped to a different path
      // Example: /foo/real_path -> /foo/symlink, /foo/remapped_path -> /foo/real_path
      // In this case, if the file watcher returns /foo/remapped_path/file.txt, we want to report /foo/symlink/file.txt back to IntelliJ.
      var preRemapPathToWatchedPaths = applyMapping(to);
      for (var realWatchedPath : preRemapPathToWatchedPaths) {
        myPathMappings.putValue(from, realWatchedPath);
      }

      // Since there can be more than one file watcher and REMAPPING is an implementation detail of the native file watcher,
      // add the mapping as usual even if we added data above.
      myPathMappings.putValue(from, to);
    }
  }
void addMapping(@NotNull Collection<? extends Pair<String, String>> mapping)