diff --git a/src/LanguageServer/Protocol/Handler/AbstractRefreshQueue.cs b/src/LanguageServer/Protocol/Handler/AbstractRefreshQueue.cs index 436a66f1f83f6..98d9c36048462 100644 --- a/src/LanguageServer/Protocol/Handler/AbstractRefreshQueue.cs +++ b/src/LanguageServer/Protocol/Handler/AbstractRefreshQueue.cs @@ -104,7 +104,7 @@ protected void EnqueueRefreshNotification(DocumentUri? documentUri) } } - private ValueTask FilterLspTrackedDocumentsAsync( + private async ValueTask FilterLspTrackedDocumentsAsync( LspWorkspaceManager lspWorkspaceManager, IClientLanguageServerManager notificationManager, ImmutableSegmentedList documentUris, @@ -117,7 +117,11 @@ private ValueTask FilterLspTrackedDocumentsAsync( { try { - return notificationManager.SendRequestAsync(GetWorkspaceRefreshName(), cancellationToken); + // Fire the notification and immediately return. Refresh notifications are server-wide, and are not + // associated with a particular project/document. So once we've sent one, we can stop processing + // entirely. + await notificationManager.SendRequestAsync(GetWorkspaceRefreshName(), cancellationToken).ConfigureAwait(false); + return; } catch (Exception ex) when (ex is ObjectDisposedException or ConnectionLostException) { @@ -128,7 +132,6 @@ private ValueTask FilterLspTrackedDocumentsAsync( } // LSP is already tracking all changed documents so we don't need to send a refresh request. - return ValueTask.CompletedTask; } public virtual void Dispose() diff --git a/src/LanguageServer/Protocol/Handler/SourceGenerators/SourceGeneratorRefreshQueue.cs b/src/LanguageServer/Protocol/Handler/SourceGenerators/SourceGeneratorRefreshQueue.cs index 3658140436c78..1e2cf287c54e5 100644 --- a/src/LanguageServer/Protocol/Handler/SourceGenerators/SourceGeneratorRefreshQueue.cs +++ b/src/LanguageServer/Protocol/Handler/SourceGenerators/SourceGeneratorRefreshQueue.cs @@ -120,27 +120,25 @@ await newProject.GetDependentVersionAsync(_disposalTokenSource.Token).ConfigureA } } - private ValueTask RefreshSourceGeneratedDocumentsAsync( + private async ValueTask RefreshSourceGeneratedDocumentsAsync( CancellationToken cancellationToken) { var hasOpenSourceGeneratedDocuments = _lspWorkspaceManager.GetTrackedLspText().Keys.Any(uri => uri.ParsedUri?.Scheme == SourceGeneratedDocumentUri.Scheme); if (!hasOpenSourceGeneratedDocuments) { // There are no opened source generated documents - we don't need to bother asking the client to refresh anything. - return ValueTask.CompletedTask; + return; } try { - return _notificationManager.SendNotificationAsync(RefreshSourceGeneratedDocumentName, cancellationToken); + await _notificationManager.SendNotificationAsync(RefreshSourceGeneratedDocumentName, cancellationToken).ConfigureAwait(false); } catch (Exception ex) when (ex is ObjectDisposedException or ConnectionLostException) { // It is entirely possible that we're shutting down and the connection is lost while we're trying to send a notification // as this runs outside of the guaranteed ordering in the queue. We can safely ignore this exception. } - - return ValueTask.CompletedTask; } public void Dispose()