diff --git a/internal/execute/watcher.go b/internal/execute/watcher.go index 9b11c2a4dd4..c9cdeb55f96 100644 --- a/internal/execute/watcher.go +++ b/internal/execute/watcher.go @@ -185,14 +185,24 @@ func (w *Watcher) computeDesiredWatches(seenFilePaths []string) map[string]bool resolvedDirs := w.wm.ResolveDesiredDirs(desiredDirs) opts := w.comparePathsOptions() + toAddDirs := make(map[tspath.Path]string) // canonicalized dir → original dir for _, filePath := range seenFilePaths { dir := tspath.GetDirectoryPath(filePath) - if !watchmanager.IsDirCoveredByWatch(resolvedDirs, dir, opts) { - if watchmanager.CanWatchDirectory(dir) { - resolvedDirs[dir] = false + canonicalDir := tspath.ToPath(dir, cwd, opts.UseCaseSensitiveFileNames) + if _, has := toAddDirs[canonicalDir]; !has { + if !watchmanager.IsDirCoveredByWatch(resolvedDirs, dir, opts) && watchmanager.CanWatchDirectory(dir) { + toAddDirs[canonicalDir] = dir + } else { + // Cache the IsDirCoveredByWatch call, but don't add the dir + toAddDirs[canonicalDir] = "" } } } + for _, dir := range toAddDirs { + if dir != "" { + resolvedDirs[dir] = false + } + } // Re-resolve in case newly added dirs don't exist return w.wm.ResolveDesiredDirs(resolvedDirs)