diff --git a/src/EditorFeatures/Core/Remote/SolutionChecksumUpdater.cs b/src/EditorFeatures/Core/Remote/SolutionChecksumUpdater.cs
index 033c8a6db585a..af652ffedf2e0 100644
--- a/src/EditorFeatures/Core/Remote/SolutionChecksumUpdater.cs
+++ b/src/EditorFeatures/Core/Remote/SolutionChecksumUpdater.cs
@@ -25,12 +25,6 @@ internal sealed class SolutionChecksumUpdater
{
private readonly Workspace _workspace;
- ///
- /// We're not at a layer where we are guaranteed to have an IGlobalOperationNotificationService. So allow for
- /// it being null.
- ///
- private readonly IGlobalOperationNotificationService? _globalOperationService;
-
private readonly IDocumentTrackingService _documentTrackingService;
///
@@ -54,8 +48,6 @@ internal sealed class SolutionChecksumUpdater
private const string SynchronizeTextChangesStatusSucceededKeyName = nameof(SolutionChecksumUpdater) + "." + SynchronizeTextChangesStatusSucceededMetricName;
private const string SynchronizeTextChangesStatusFailedKeyName = nameof(SolutionChecksumUpdater) + "." + SynchronizeTextChangesStatusFailedMetricName;
- private bool _isSynchronizeWorkspacePaused;
-
public SolutionChecksumUpdater(
Workspace workspace,
IAsynchronousOperationListenerProvider listenerProvider,
@@ -63,8 +55,6 @@ public SolutionChecksumUpdater(
{
var listener = listenerProvider.GetListener(FeatureAttribute.SolutionChecksumUpdater);
- _globalOperationService = workspace.Services.SolutionServices.ExportProvider.GetExports().FirstOrDefault()?.Value;
-
_workspace = workspace;
_documentTrackingService = workspace.Services.GetRequiredService();
@@ -87,12 +77,6 @@ public SolutionChecksumUpdater(
_workspaceChangedImmediateDisposer = _workspace.RegisterWorkspaceChangedImmediateHandler(OnWorkspaceChangedImmediate);
_documentTrackingService.ActiveDocumentChanged += OnActiveDocumentChanged;
- if (_globalOperationService != null)
- {
- _globalOperationService.Started += OnGlobalOperationStarted;
- _globalOperationService.Stopped += OnGlobalOperationStopped;
- }
-
// Enqueue the work to sync the initial data over.
_synchronizeActiveDocumentQueue.AddWork();
_synchronizeWorkspaceQueue.AddWork();
@@ -101,53 +85,21 @@ public SolutionChecksumUpdater(
public void Shutdown()
{
// Try to stop any work that is in progress.
- PauseSynchronizingPrimaryWorkspace();
-
- _documentTrackingService.ActiveDocumentChanged -= OnActiveDocumentChanged;
- _workspaceChangedDisposer.Dispose();
- _workspaceChangedImmediateDisposer.Dispose();
-
- if (_globalOperationService != null)
- {
- _globalOperationService.Started -= OnGlobalOperationStarted;
- _globalOperationService.Stopped -= OnGlobalOperationStopped;
- }
- }
-
- private void OnGlobalOperationStarted(object? sender, EventArgs e)
- => PauseSynchronizingPrimaryWorkspace();
-
- private void OnGlobalOperationStopped(object? sender, EventArgs e)
- => ResumeSynchronizingPrimaryWorkspace();
-
- private void PauseSynchronizingPrimaryWorkspace()
- {
- // An expensive global operation started (like a build). Pause ourselves and cancel any outstanding work in
- // progress to synchronize the solution.
lock (_gate)
{
_synchronizeWorkspaceQueue.CancelExistingWork();
- _isSynchronizeWorkspacePaused = true;
}
- }
- private void ResumeSynchronizingPrimaryWorkspace()
- {
- lock (_gate)
- {
- _isSynchronizeWorkspacePaused = false;
- _synchronizeWorkspaceQueue.AddWork();
- }
+ _documentTrackingService.ActiveDocumentChanged -= OnActiveDocumentChanged;
+ _workspaceChangedDisposer.Dispose();
+ _workspaceChangedImmediateDisposer.Dispose();
}
private void OnWorkspaceChanged(WorkspaceChangeEventArgs _)
{
- // Check if we're currently paused. If so ignore this notification. We don't want to any work in response
- // to whatever the workspace is doing.
lock (_gate)
{
- if (!_isSynchronizeWorkspacePaused)
- _synchronizeWorkspaceQueue.AddWork();
+ _synchronizeWorkspaceQueue.AddWork();
}
}
diff --git a/src/EditorFeatures/TestUtilities/EditorTestCompositions.cs b/src/EditorFeatures/TestUtilities/EditorTestCompositions.cs
index 2fdf5a8f5cc45..f000aae87914f 100644
--- a/src/EditorFeatures/TestUtilities/EditorTestCompositions.cs
+++ b/src/EditorFeatures/TestUtilities/EditorTestCompositions.cs
@@ -7,7 +7,6 @@
using Microsoft.CodeAnalysis.Editor.Implementation.Notification;
using Microsoft.CodeAnalysis.LanguageServer;
using Microsoft.CodeAnalysis.Test.Utilities;
-using Microsoft.CodeAnalysis.Test.Utilities.Notification;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.UnitTests.Fakes;
using Microsoft.CodeAnalysis.UnitTests.Remote;
@@ -57,7 +56,6 @@ public static class EditorTestCompositions
typeof(TestObscuringTipManager)); // TODO: https://devdiv.visualstudio.com/DevDiv/_workitems?id=544569
public static readonly TestComposition EditorFeatures = FeaturesTestCompositions.Features
- .AddParts(typeof(TestGlobalOperationNotificationService))
.Add(Editor)
.AddAssemblies(
typeof(TextEditorResources).Assembly,
diff --git a/src/EditorFeatures/TestUtilities/Notification/TestGlobalOperationNotificationService.cs b/src/EditorFeatures/TestUtilities/Notification/TestGlobalOperationNotificationService.cs
deleted file mode 100644
index d0b89fb4cdd71..0000000000000
--- a/src/EditorFeatures/TestUtilities/Notification/TestGlobalOperationNotificationService.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System;
-using System.Composition;
-using System.Threading;
-using Microsoft.CodeAnalysis.Host.Mef;
-using Microsoft.CodeAnalysis.Notification;
-using Microsoft.CodeAnalysis.Shared.TestHooks;
-using Microsoft.VisualStudio.Composition;
-
-namespace Microsoft.CodeAnalysis.Test.Utilities.Notification;
-
-[Export(typeof(IGlobalOperationNotificationService)), PartNotDiscoverable, Shared]
-[method: ImportingConstructor]
-[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
-internal sealed class TestGlobalOperationNotificationService(
- IAsynchronousOperationListenerProvider listenerProvider)
- : AbstractGlobalOperationNotificationService(listenerProvider, CancellationToken.None);
diff --git a/src/Workspaces/Core/Portable/Notification/AbstractGlobalOperationNotificationService.GlobalOperationRegistration.cs b/src/Features/Core/Portable/ExternalAccess/UnitTesting/Notification/AbstractGlobalOperationNotificationService.GlobalOperationRegistration.cs
similarity index 88%
rename from src/Workspaces/Core/Portable/Notification/AbstractGlobalOperationNotificationService.GlobalOperationRegistration.cs
rename to src/Features/Core/Portable/ExternalAccess/UnitTesting/Notification/AbstractGlobalOperationNotificationService.GlobalOperationRegistration.cs
index 834def7386a04..4dcd7ed20151d 100644
--- a/src/Workspaces/Core/Portable/Notification/AbstractGlobalOperationNotificationService.GlobalOperationRegistration.cs
+++ b/src/Features/Core/Portable/ExternalAccess/UnitTesting/Notification/AbstractGlobalOperationNotificationService.GlobalOperationRegistration.cs
@@ -4,7 +4,7 @@
using System;
-namespace Microsoft.CodeAnalysis.Notification;
+namespace Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
internal partial class AbstractGlobalOperationNotificationService
{
diff --git a/src/Workspaces/Core/Portable/Notification/AbstractGlobalOperationNotificationService.cs b/src/Features/Core/Portable/ExternalAccess/UnitTesting/Notification/AbstractGlobalOperationNotificationService.cs
similarity index 97%
rename from src/Workspaces/Core/Portable/Notification/AbstractGlobalOperationNotificationService.cs
rename to src/Features/Core/Portable/ExternalAccess/UnitTesting/Notification/AbstractGlobalOperationNotificationService.cs
index c8a88b0ac843d..7db4b6d79c0a3 100644
--- a/src/Workspaces/Core/Portable/Notification/AbstractGlobalOperationNotificationService.cs
+++ b/src/Features/Core/Portable/ExternalAccess/UnitTesting/Notification/AbstractGlobalOperationNotificationService.cs
@@ -11,7 +11,7 @@
using Microsoft.CodeAnalysis.Threading;
using Roslyn.Utilities;
-namespace Microsoft.CodeAnalysis.Notification;
+namespace Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
internal abstract partial class AbstractGlobalOperationNotificationService : IGlobalOperationNotificationService
{
diff --git a/src/Workspaces/Core/Portable/Notification/IGlobalOperationNotificationService.cs b/src/Features/Core/Portable/ExternalAccess/UnitTesting/Notification/IGlobalOperationNotificationService.cs
similarity index 91%
rename from src/Workspaces/Core/Portable/Notification/IGlobalOperationNotificationService.cs
rename to src/Features/Core/Portable/ExternalAccess/UnitTesting/Notification/IGlobalOperationNotificationService.cs
index 8e0e83c30ff95..9b3b4b165c15f 100644
--- a/src/Workspaces/Core/Portable/Notification/IGlobalOperationNotificationService.cs
+++ b/src/Features/Core/Portable/ExternalAccess/UnitTesting/Notification/IGlobalOperationNotificationService.cs
@@ -4,7 +4,7 @@
using System;
-namespace Microsoft.CodeAnalysis.Notification;
+namespace Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
///
/// Optional interface that can be used to hear about when expensive global operations (like a 'build') occur in the
diff --git a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingGlobalOperationAwareIdleProcessor.cs b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingGlobalOperationAwareIdleProcessor.cs
index 239d19b5815d1..e87a2e6c9fac6 100644
--- a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingGlobalOperationAwareIdleProcessor.cs
+++ b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingGlobalOperationAwareIdleProcessor.cs
@@ -4,7 +4,7 @@
using System;
using System.Threading;
-using Microsoft.CodeAnalysis.Notification;
+using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
using Microsoft.CodeAnalysis.Shared.TestHooks;
namespace Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.SolutionCrawler;
diff --git a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.AbstractUnitTestingPriorityProcessor.cs b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.AbstractUnitTestingPriorityProcessor.cs
index 826660ba0a116..3448fa733e8a1 100644
--- a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.AbstractUnitTestingPriorityProcessor.cs
+++ b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.AbstractUnitTestingPriorityProcessor.cs
@@ -6,8 +6,8 @@
using System.Collections.Immutable;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
using Microsoft.CodeAnalysis.Internal.Log;
-using Microsoft.CodeAnalysis.Notification;
using Microsoft.CodeAnalysis.Shared.TestHooks;
namespace Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.SolutionCrawler;
diff --git a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingIncrementalAnalyzerProcessor.cs b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingIncrementalAnalyzerProcessor.cs
index c53d53d313e8e..fa947bf994373 100644
--- a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingIncrementalAnalyzerProcessor.cs
+++ b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingIncrementalAnalyzerProcessor.cs
@@ -10,6 +10,7 @@
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Api;
+using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.LanguageService;
diff --git a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingLowPriorityProcessor.cs b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingLowPriorityProcessor.cs
index 4d63273c453cd..ad2226f356bf8 100644
--- a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingLowPriorityProcessor.cs
+++ b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingLowPriorityProcessor.cs
@@ -8,8 +8,8 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.ErrorReporting;
+using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
using Microsoft.CodeAnalysis.Internal.Log;
-using Microsoft.CodeAnalysis.Notification;
using Microsoft.CodeAnalysis.Shared.TestHooks;
namespace Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.SolutionCrawler;
diff --git a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingNormalPriorityProcessor.cs b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingNormalPriorityProcessor.cs
index 1fe3c323fddc9..de906318b9248 100644
--- a/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingNormalPriorityProcessor.cs
+++ b/src/Features/Core/Portable/ExternalAccess/UnitTesting/SolutionCrawler/UnitTestingWorkCoordinator.UnitTestingNormalPriorityProcessor.cs
@@ -10,11 +10,11 @@
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.Internal.Log;
-using Microsoft.CodeAnalysis.Notification;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.TestHooks;
using Roslyn.Utilities;
using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Api;
+using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
#if DEBUG
using System.Diagnostics;
diff --git a/src/VisualStudio/Core/Def/SolutionEventMonitor.cs b/src/VisualStudio/Core/Def/ExternalAccess/UnitTesting/SolutionEventMonitor.cs
similarity index 95%
rename from src/VisualStudio/Core/Def/SolutionEventMonitor.cs
rename to src/VisualStudio/Core/Def/ExternalAccess/UnitTesting/SolutionEventMonitor.cs
index 5011b4542c63d..e209d1eaea5ba 100644
--- a/src/VisualStudio/Core/Def/SolutionEventMonitor.cs
+++ b/src/VisualStudio/Core/Def/ExternalAccess/UnitTesting/SolutionEventMonitor.cs
@@ -5,10 +5,10 @@
using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis;
-using Microsoft.CodeAnalysis.Notification;
+using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
using Microsoft.VisualStudio.Shell;
-namespace Microsoft.VisualStudio.LanguageServices;
+namespace Microsoft.VisualStudio.LanguageServices.ExternalAccess.UnitTesting;
///
/// Monitors Visual Studio's UIContext for Solution building/opening/closing and notifies the GlobalOperationService.
diff --git a/src/VisualStudio/Core/Def/Notification/VisualStudioGlobalOperationNotificationService.cs b/src/VisualStudio/Core/Def/ExternalAccess/UnitTesting/VisualStudioGlobalOperationNotificationService.cs
similarity index 84%
rename from src/VisualStudio/Core/Def/Notification/VisualStudioGlobalOperationNotificationService.cs
rename to src/VisualStudio/Core/Def/ExternalAccess/UnitTesting/VisualStudioGlobalOperationNotificationService.cs
index d5ab5dd3ae2f6..b7eeb9166331b 100644
--- a/src/VisualStudio/Core/Def/Notification/VisualStudioGlobalOperationNotificationService.cs
+++ b/src/VisualStudio/Core/Def/ExternalAccess/UnitTesting/VisualStudioGlobalOperationNotificationService.cs
@@ -5,11 +5,11 @@
using System;
using System.Composition;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
+using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
using Microsoft.CodeAnalysis.Host.Mef;
-using Microsoft.CodeAnalysis.Notification;
using Microsoft.CodeAnalysis.Shared.TestHooks;
-namespace Microsoft.VisualStudio.LanguageServices.Implementation.Notification;
+namespace Microsoft.VisualStudio.LanguageServices.ExternalAccess.UnitTesting;
[Export(typeof(IGlobalOperationNotificationService)), Shared]
[method: ImportingConstructor]
diff --git a/src/VisualStudio/Core/Def/RoslynPackage.cs b/src/VisualStudio/Core/Def/RoslynPackage.cs
index bb3f93c94449a..767d778be6850 100644
--- a/src/VisualStudio/Core/Def/RoslynPackage.cs
+++ b/src/VisualStudio/Core/Def/RoslynPackage.cs
@@ -14,10 +14,12 @@
using Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.AsyncCompletion;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.ErrorReporting;
+using Microsoft.CodeAnalysis.ExternalAccess.UnitTesting.Notification;
using Microsoft.CodeAnalysis.Notification;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Remote.ProjectSystem;
using Microsoft.VisualStudio.LanguageServices.EditorConfigSettings;
+using Microsoft.VisualStudio.LanguageServices.ExternalAccess.UnitTesting;
using Microsoft.VisualStudio.LanguageServices.Implementation.Diagnostics;
using Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService;
using Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem.RuleSets;
@@ -215,11 +217,8 @@ protected override void Dispose(bool disposing)
ReportSessionWideTelemetry();
- if (_solutionEventMonitor != null)
- {
- _solutionEventMonitor.Dispose();
- _solutionEventMonitor = null;
- }
+ _solutionEventMonitor?.Dispose();
+ _solutionEventMonitor = null;
base.Dispose(disposing);
}