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);
+ }
+ }
}
}