diff --git a/src/OmniSharp.Abstractions/FileWatching/IFileSystemWatcher.cs b/src/OmniSharp.Abstractions/FileWatching/IFileSystemWatcher.cs index 9e6f4d0c46..90bccf5196 100644 --- a/src/OmniSharp.Abstractions/FileWatching/IFileSystemWatcher.cs +++ b/src/OmniSharp.Abstractions/FileWatching/IFileSystemWatcher.cs @@ -9,8 +9,8 @@ public interface IFileSystemWatcher /// /// Call to watch a file or directory path for changes. /// - /// The file or directory path to watch. + /// The file path, directory path or file extension to watch. /// The callback that will be invoked when a change occurs in the watched file or directory. - void Watch(string fileOrDirectoryPath, FileSystemNotificationCallback callback); + void Watch(string pathOrExtension, FileSystemNotificationCallback callback); } } diff --git a/src/OmniSharp.Host/FileWatching/ManualFileSystemWatcher.cs b/src/OmniSharp.Host/FileWatching/ManualFileSystemWatcher.cs index 4c85f97897..531b3ffbab 100644 --- a/src/OmniSharp.Host/FileWatching/ManualFileSystemWatcher.cs +++ b/src/OmniSharp.Host/FileWatching/ManualFileSystemWatcher.cs @@ -29,19 +29,26 @@ public void Notify(string filePath, FileChangeType changeType = FileChangeType.U { directoryCallback(filePath, changeType); } + + var extension = Path.GetExtension(filePath); + if (!string.IsNullOrEmpty(extension) && + _callbacks.TryGetValue(extension, out var extensionCallback)) + { + extensionCallback(filePath, changeType); + } } } - public void Watch(string fileOrDirectoryPath, FileSystemNotificationCallback callback) + public void Watch(string pathOrExtension, FileSystemNotificationCallback callback) { lock (_gate) { - if (_callbacks.TryGetValue(fileOrDirectoryPath, out var existingCallback)) + if (_callbacks.TryGetValue(pathOrExtension, out var existingCallback)) { callback = callback + existingCallback; } - _callbacks[fileOrDirectoryPath] = callback; + _callbacks[pathOrExtension] = callback; } } } diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/FilesChangedFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/FilesChangedFacts.cs index 799cfb764f..7e63762e79 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/FilesChangedFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/FilesChangedFacts.cs @@ -55,5 +55,22 @@ public void TestMultipleDirectoryWatchers() Assert.True(secondWatcherCalled); } } + + [Fact] + public void TestFileExtensionWatchers() + { + using (var host = CreateEmptyOmniSharpHost()) + { + var watcher = host.GetExport(); + + var extensionWatcherCalled = false; + watcher.Watch(".cs", (path, changeType) => { extensionWatcherCalled = true; }); + + var handler = GetRequestHandler(host); + handler.Handle(new[] { new FilesChangedRequest() { FileName = "FileName.cs", ChangeType = FileChangeType.Create } }); + + Assert.True(extensionWatcherCalled); + } + } } }