diff --git a/Razor.sln b/Razor.sln
index d4272b23e4..45dea45281 100644
--- a/Razor.sln
+++ b/Razor.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
-VisualStudioVersion = 15.0.26927.3
+VisualStudioVersion = 15.0.27128.0
MinimumVisualStudioVersion = 15.0.26730.03
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{3C0D6505-79B3-49D0-B4C3-176F0F1836ED}"
ProjectSection(SolutionItems) = preProject
@@ -76,6 +76,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.Mac.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.Mac.LanguageServices.Razor", "src\Microsoft.VisualStudio.Mac.LanguageServices.Razor\Microsoft.VisualStudio.Mac.LanguageServices.Razor.csproj", "{95B18DEE-8B45-4CF0-B9F8-CCBAF3B5251A}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test", "test\Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test\Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test.csproj", "{B8A3E4CA-D54A-441F-A3BF-E00F060CA042}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -306,6 +308,14 @@ Global
{95B18DEE-8B45-4CF0-B9F8-CCBAF3B5251A}.Release|Any CPU.Build.0 = Release|Any CPU
{95B18DEE-8B45-4CF0-B9F8-CCBAF3B5251A}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU
{95B18DEE-8B45-4CF0-B9F8-CCBAF3B5251A}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU
+ {B8A3E4CA-D54A-441F-A3BF-E00F060CA042}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B8A3E4CA-D54A-441F-A3BF-E00F060CA042}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B8A3E4CA-D54A-441F-A3BF-E00F060CA042}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU
+ {B8A3E4CA-D54A-441F-A3BF-E00F060CA042}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU
+ {B8A3E4CA-D54A-441F-A3BF-E00F060CA042}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B8A3E4CA-D54A-441F-A3BF-E00F060CA042}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B8A3E4CA-D54A-441F-A3BF-E00F060CA042}.ReleaseNoVSIX|Any CPU.ActiveCfg = Release|Any CPU
+ {B8A3E4CA-D54A-441F-A3BF-E00F060CA042}.ReleaseNoVSIX|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -339,6 +349,7 @@ Global
{FC684D4F-D23C-407C-9C68-E10EF3B38560} = {92463391-81BE-462B-AC3C-78C6C760741F}
{FAF9986F-E086-4513-9D52-F7BF5FFCF31D} = {C0CC1E1F-1559-44DE-93A8-63259CEA2AAB}
{95B18DEE-8B45-4CF0-B9F8-CCBAF3B5251A} = {3C0D6505-79B3-49D0-B4C3-176F0F1836ED}
+ {B8A3E4CA-D54A-441F-A3BF-E00F060CA042} = {92463391-81BE-462B-AC3C-78C6C760741F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0035341D-175A-4D05-95E6-F1C2785A1E26}
diff --git a/build/repo.props b/build/repo.props
index 5368f8f2b0..06e094ce85 100644
--- a/build/repo.props
+++ b/build/repo.props
@@ -2,6 +2,7 @@
+
diff --git a/src/Microsoft.CodeAnalysis.Razor.Workspaces/Properties/AssemblyInfo.cs b/src/Microsoft.CodeAnalysis.Razor.Workspaces/Properties/AssemblyInfo.cs
index 68c221f568..a73900fa42 100644
--- a/src/Microsoft.CodeAnalysis.Razor.Workspaces/Properties/AssemblyInfo.cs
+++ b/src/Microsoft.CodeAnalysis.Razor.Workspaces/Properties/AssemblyInfo.cs
@@ -9,6 +9,7 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Editor.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Editor.Razor.Test.Common, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Mac.LanguageServices.Razor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.LanguageServices.Razor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.LanguageServices.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.RazorExtension, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Microsoft.VisualStudio.Editor.Razor/Properties/AssemblyInfo.cs b/src/Microsoft.VisualStudio.Editor.Razor/Properties/AssemblyInfo.cs
index f8e2830b09..fce64fd49b 100644
--- a/src/Microsoft.VisualStudio.Editor.Razor/Properties/AssemblyInfo.cs
+++ b/src/Microsoft.VisualStudio.Editor.Razor/Properties/AssemblyInfo.cs
@@ -5,6 +5,7 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Editor.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Mac.LanguageServices.Razor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.LanguageServices.Razor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.LanguageServices.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.RazorExtension, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/DefaultFileChangeTracker.cs b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/DefaultFileChangeTracker.cs
new file mode 100644
index 0000000000..2848dadb88
--- /dev/null
+++ b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/DefaultFileChangeTracker.cs
@@ -0,0 +1,130 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.CodeAnalysis.Razor;
+using Microsoft.VisualStudio.Editor.Razor;
+using MonoDevelop.Core;
+
+namespace Microsoft.VisualStudio.Mac.LanguageServices.Razor
+{
+ internal class DefaultFileChangeTracker : FileChangeTracker
+ {
+ private readonly ForegroundDispatcher _foregroundDispatcher;
+ private readonly string _normalizedFilePath;
+ private bool _listening;
+
+ public override event EventHandler Changed;
+
+ public DefaultFileChangeTracker(
+ string filePath,
+ ForegroundDispatcher foregroundDispatcher)
+ {
+ if (string.IsNullOrEmpty(filePath))
+ {
+ throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(filePath));
+ }
+
+ if (foregroundDispatcher == null)
+ {
+ throw new ArgumentNullException(nameof(foregroundDispatcher));
+ }
+
+ FilePath = filePath;
+ _normalizedFilePath = NormalizePath(FilePath);
+ _foregroundDispatcher = foregroundDispatcher;
+ }
+
+ public override string FilePath { get; }
+
+ public override void StartListening()
+ {
+ _foregroundDispatcher.AssertForegroundThread();
+
+ if (_listening)
+ {
+ return;
+ }
+
+ AttachToFileServiceEvents();
+
+ _listening = true;
+ }
+
+ public override void StopListening()
+ {
+ _foregroundDispatcher.AssertForegroundThread();
+
+ if (!_listening)
+ {
+ return;
+ }
+
+ DetachFromFileServiceEvents();
+
+ _listening = false;
+ }
+
+ // Virtual for testing
+ protected virtual void AttachToFileServiceEvents()
+ {
+ FileService.FileChanged += FileService_FileChanged;
+ FileService.FileCreated += FileService_FileCreated;
+ FileService.FileRemoved += FileService_FileRemoved;
+ }
+
+ // Virtual for testing
+ protected virtual void DetachFromFileServiceEvents()
+ {
+ FileService.FileChanged -= FileService_FileChanged;
+ FileService.FileCreated -= FileService_FileCreated;
+ FileService.FileRemoved -= FileService_FileRemoved;
+ }
+
+ private void FileService_FileChanged(object sender, FileEventArgs args) => HandleFileChangeEvent(FileChangeKind.Changed, args);
+
+ private void FileService_FileCreated(object sender, FileEventArgs args) => HandleFileChangeEvent(FileChangeKind.Added, args);
+
+ private void FileService_FileRemoved(object sender, FileEventArgs args) => HandleFileChangeEvent(FileChangeKind.Removed, args);
+
+ private void HandleFileChangeEvent(FileChangeKind changeKind, FileEventArgs args)
+ {
+ _foregroundDispatcher.AssertForegroundThread();
+
+ if (Changed == null)
+ {
+ return;
+ }
+
+ foreach (var fileEvent in args)
+ {
+ if (fileEvent.IsDirectory)
+ {
+ continue;
+ }
+
+ var normalizedEventPath = NormalizePath(fileEvent.FileName.FullPath);
+ if (string.Equals(_normalizedFilePath, normalizedEventPath, StringComparison.OrdinalIgnoreCase))
+ {
+ OnChanged(changeKind);
+ return;
+ }
+ }
+ }
+
+ private void OnChanged(FileChangeKind changeKind)
+ {
+ _foregroundDispatcher.AssertForegroundThread();
+
+ var args = new FileChangeEventArgs(FilePath, changeKind);
+ Changed?.Invoke(this, args);
+ }
+
+ private static string NormalizePath(string path)
+ {
+ path = path.Replace('\\', '/');
+
+ return path;
+ }
+ }
+}
diff --git a/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/DefaultFileChangeTrackerFactory.cs b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/DefaultFileChangeTrackerFactory.cs
new file mode 100644
index 0000000000..33aa73fd41
--- /dev/null
+++ b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/DefaultFileChangeTrackerFactory.cs
@@ -0,0 +1,35 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.CodeAnalysis.Razor;
+using Microsoft.VisualStudio.Editor.Razor;
+
+namespace Microsoft.VisualStudio.Mac.LanguageServices.Razor
+{
+ internal class DefaultFileChangeTrackerFactory : FileChangeTrackerFactory
+ {
+ private readonly ForegroundDispatcher _foregroundDispatcher;
+
+ public DefaultFileChangeTrackerFactory(ForegroundDispatcher foregroundDispatcher)
+ {
+ if (foregroundDispatcher == null)
+ {
+ throw new ArgumentNullException(nameof(foregroundDispatcher));
+ }
+
+ _foregroundDispatcher = foregroundDispatcher;
+ }
+
+ public override FileChangeTracker Create(string filePath)
+ {
+ if (string.IsNullOrEmpty(filePath))
+ {
+ throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(filePath));
+ }
+
+ var fileChangeTracker = new DefaultFileChangeTracker(filePath, _foregroundDispatcher);
+ return fileChangeTracker;
+ }
+ }
+}
diff --git a/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/DefaultFileChangeTrackerFactoryFactory.cs b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/DefaultFileChangeTrackerFactoryFactory.cs
new file mode 100644
index 0000000000..54d708b118
--- /dev/null
+++ b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/DefaultFileChangeTrackerFactoryFactory.cs
@@ -0,0 +1,29 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Composition;
+using Microsoft.CodeAnalysis.Host;
+using Microsoft.CodeAnalysis.Host.Mef;
+using Microsoft.CodeAnalysis.Razor;
+using Microsoft.VisualStudio.Editor.Razor;
+
+namespace Microsoft.VisualStudio.Mac.LanguageServices.Razor
+{
+ [Shared]
+ [ExportLanguageServiceFactory(typeof(FileChangeTrackerFactory), RazorLanguage.Name, ServiceLayer.Default)]
+ internal class DefaultFileChangeTrackerFactoryFactory : ILanguageServiceFactory
+ {
+ public ILanguageService CreateLanguageService(HostLanguageServices languageServices)
+ {
+ if (languageServices == null)
+ {
+ throw new ArgumentNullException(nameof(languageServices));
+ }
+
+ var foregroundDispatcher = languageServices.WorkspaceServices.GetRequiredService();
+ var errorReporter = languageServices.WorkspaceServices.GetRequiredService();
+ return new DefaultFileChangeTrackerFactory(foregroundDispatcher);
+ }
+ }
+}
diff --git a/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Properties/AssemblyInfo.cs b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..d49ca03713
--- /dev/null
+++ b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Properties/AssemblyInfo.cs
@@ -0,0 +1,7 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.Runtime.CompilerServices;
+
+[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
diff --git a/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Properties/Resources.Designer.cs b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Properties/Resources.Designer.cs
index 1afd67a924..3e486a9d9e 100644
--- a/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Properties/Resources.Designer.cs
+++ b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Properties/Resources.Designer.cs
@@ -10,6 +10,20 @@ namespace Microsoft.VisualStudio.Mac.LanguageServices.Razor
private static readonly ResourceManager _resourceManager
= new ResourceManager("Microsoft.VisualStudio.Mac.LanguageServices.Razor.Resources", typeof(Resources).GetTypeInfo().Assembly);
+ ///
+ /// Value cannot be null or an empty string.
+ ///
+ internal static string ArgumentCannotBeNullOrEmpty
+ {
+ get => GetString("ArgumentCannotBeNullOrEmpty");
+ }
+
+ ///
+ /// Value cannot be null or an empty string.
+ ///
+ internal static string FormatArgumentCannotBeNullOrEmpty()
+ => GetString("ArgumentCannotBeNullOrEmpty");
+
///
/// Razor Language Service error encountered.
///
diff --git a/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Resources.resx b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Resources.resx
index b62fd544ab..9b004fd397 100644
--- a/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Resources.resx
+++ b/src/Microsoft.VisualStudio.Mac.LanguageServices.Razor/Resources.resx
@@ -117,6 +117,9 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ Value cannot be null or an empty string.
+
Razor Language Service error encountered.
diff --git a/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/Properties/AssemblyInfo.cs b/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/Properties/AssemblyInfo.cs
index d9bb89536a..2ef25d5390 100644
--- a/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/Properties/AssemblyInfo.cs
+++ b/test/Microsoft.VisualStudio.Editor.Razor.Test.Common/Properties/AssemblyInfo.cs
@@ -5,4 +5,5 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.CodeAnalysis.Razor.Workspaces.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Editor.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.VisualStudio.LanguageServices.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
diff --git a/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/DefaultFileChangeTrackerTest.cs b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/DefaultFileChangeTrackerTest.cs
index 082ce9212d..bb7d32669d 100644
--- a/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/DefaultFileChangeTrackerTest.cs
+++ b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/DefaultFileChangeTrackerTest.cs
@@ -79,7 +79,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor
}
[ForegroundFact]
- public void StartListening_NotListening_DoesNothing()
+ public void StopListening_NotListening_DoesNothing()
{
// Arrange
uint cookie = VSConstants.VSCOOKIE_NIL;
@@ -108,7 +108,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor
.Setup(f => f.AdviseFileChange(It.IsAny(), It.IsAny(), It.IsAny(), out cookie))
.Returns(VSConstants.S_OK);
var tracker = new DefaultFileChangeTracker(filePath, Dispatcher, ErrorReporter, fileChangeService.Object);
-
+
var called = false;
tracker.Changed += (sender, args) =>
{
diff --git a/test/Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test/DefaultFileChangeTrackerTest.cs b/test/Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test/DefaultFileChangeTrackerTest.cs
new file mode 100644
index 0000000000..a605ae7258
--- /dev/null
+++ b/test/Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test/DefaultFileChangeTrackerTest.cs
@@ -0,0 +1,89 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.CodeAnalysis.Razor;
+using Microsoft.VisualStudio.Editor.Razor;
+using MonoDevelop.Core;
+using Moq;
+using Xunit;
+
+namespace Microsoft.VisualStudio.Mac.LanguageServices.Razor
+{
+ public class DefaultFileChangeTrackerTest : ForegroundDispatcherTestBase
+ {
+ [ForegroundFact]
+ public void StartListening_AdvisesForFileChange()
+ {
+ // Arrange
+ var tracker = new TestFileChangeTracker("C:/_ViewImports.cshtml", Dispatcher);
+
+ // Act
+ tracker.StartListening();
+
+ // Assert
+ Assert.Equal(1, tracker.AttachToFileServiceEventsCount);
+ }
+
+ [ForegroundFact]
+ public void StartListening_AlreadyListening_DoesNothing()
+ {
+ // Arrange
+ var tracker = new TestFileChangeTracker("C:/_ViewImports.cshtml", Dispatcher);
+ tracker.StartListening();
+
+ // Act
+ tracker.StartListening();
+
+ // Assert
+ Assert.Equal(1, tracker.AttachToFileServiceEventsCount);
+ }
+
+ [ForegroundFact]
+ public void StopListening_UnadvisesForFileChange()
+ {
+ // Arrange
+ var tracker = new TestFileChangeTracker("C:/_ViewImports.cshtml", Dispatcher);
+ tracker.StartListening(); // Start listening for changes.
+
+ // Act
+ tracker.StopListening();
+
+ // Assert
+ Assert.Equal(1, tracker.AttachToFileServiceEventsCount);
+ Assert.Equal(1, tracker.DetachFromFileServiceEventsCount);
+ }
+
+ [ForegroundFact]
+ public void StopListening_NotListening_DoesNothing()
+ {
+ // Arrange
+ var tracker = new TestFileChangeTracker("C:/_ViewImports.cshtml", Dispatcher);
+
+ // Act
+ tracker.StopListening();
+
+ // Assert
+
+ Assert.Equal(0, tracker.AttachToFileServiceEventsCount);
+ Assert.Equal(0, tracker.DetachFromFileServiceEventsCount);
+ }
+
+ private class TestFileChangeTracker : DefaultFileChangeTracker
+ {
+ public TestFileChangeTracker(
+ string filePath,
+ ForegroundDispatcher foregroundDispatcher) : base(filePath, foregroundDispatcher)
+ {
+ }
+
+ public int AttachToFileServiceEventsCount { get; private set; }
+
+ public int DetachFromFileServiceEventsCount { get; private set; }
+
+ protected override void AttachToFileServiceEvents() => AttachToFileServiceEventsCount++;
+
+ protected override void DetachFromFileServiceEvents() => DetachFromFileServiceEventsCount++;
+ }
+ }
+}
diff --git a/test/Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test/Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test.csproj b/test/Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test/Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test.csproj
new file mode 100644
index 0000000000..4cf489bc13
--- /dev/null
+++ b/test/Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test/Microsoft.VisualStudio.Mac.LanguageServices.Razor.Test.csproj
@@ -0,0 +1,20 @@
+
+
+
+ net461
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+