提交 f408eeac 编写于 作者: D David Wengier

Docs

上级 ba116d93
...@@ -19,7 +19,9 @@ internal interface IRequestHandlerMetadata ...@@ -19,7 +19,9 @@ internal interface IRequestHandlerMetadata
string? LanguageName { get; } string? LanguageName { get; }
/// <summary> /// <summary>
/// Whether or not handling this method results in changes to the current solution state /// Whether or not handling this method results in changes to the current solution state.
/// Mutating requests will block subsequent requests from starting until after they have
/// completed and mutations have been applied. See <see cref="RequestExecutionQueue"/>.
/// </summary> /// </summary>
bool MutatesSolutionState { get; } bool MutatesSolutionState { get; }
} }
......
...@@ -33,7 +33,7 @@ public RequestExecutionQueue(ILspSolutionProvider solutionProvider) ...@@ -33,7 +33,7 @@ public RequestExecutionQueue(ILspSolutionProvider solutionProvider)
} }
/// <summary> /// <summary>
/// Queues a request to be handled by the specified handler, with mutating requests blocking future requests /// Queues a request to be handled by the specified handler, with mutating requests blocking subsequent requests
/// from starting until the mutation is complete. /// from starting until the mutation is complete.
/// </summary> /// </summary>
/// <param name="mutatesSolutionState">Whether or not the specified request needs to mutate the solution.</param> /// <param name="mutatesSolutionState">Whether or not the specified request needs to mutate the solution.</param>
...@@ -56,6 +56,9 @@ public RequestExecutionQueue(ILspSolutionProvider solutionProvider) ...@@ -56,6 +56,9 @@ public RequestExecutionQueue(ILspSolutionProvider solutionProvider)
if (cancellationToken.IsCancellationRequested) if (cancellationToken.IsCancellationRequested)
{ {
completion.SetCanceled(); completion.SetCanceled();
// Tell the queue to ignore any mutations from this request, not that we've given it a chance
// to make any
return false; return false;
} }
...@@ -63,6 +66,7 @@ public RequestExecutionQueue(ILspSolutionProvider solutionProvider) ...@@ -63,6 +66,7 @@ public RequestExecutionQueue(ILspSolutionProvider solutionProvider)
{ {
var result = await handler.HandleRequestAsync(request, context, cancellationToken).ConfigureAwait(false); var result = await handler.HandleRequestAsync(request, context, cancellationToken).ConfigureAwait(false);
completion.SetResult(result); completion.SetResult(result);
// Tell the queue that this was successful so that mutations (if any) can be applied
return true; return true;
} }
catch (OperationCanceledException) catch (OperationCanceledException)
...@@ -72,9 +76,11 @@ public RequestExecutionQueue(ILspSolutionProvider solutionProvider) ...@@ -72,9 +76,11 @@ public RequestExecutionQueue(ILspSolutionProvider solutionProvider)
catch (Exception exception) catch (Exception exception)
{ {
// Pass the exception to the task completion source, so the caller of the ExecuteAsync method can observe but // Pass the exception to the task completion source, so the caller of the ExecuteAsync method can observe but
// don't let it escape from this callback, so it doens't affect the queue processing. // don't let it escape from this callback, so it doesn't affect the queue processing.
completion.SetException(exception); completion.SetException(exception);
} }
// Tell the queue to ignore any mutations from this request
return false; return false;
}); });
_queue.Enqueue(item); _queue.Enqueue(item);
...@@ -88,6 +94,8 @@ private async Task ProcessQueueAsync() ...@@ -88,6 +94,8 @@ private async Task ProcessQueueAsync()
{ {
var work = await _queue.DequeueAsync().ConfigureAwait(false); var work = await _queue.DequeueAsync().ConfigureAwait(false);
// The "current" solution can be updated by non-LSP actions, so we need it, but we also need
// to merge in the changes from any mutations that have been applied to open documents
var solution = GetCurrentSolution(); var solution = GetCurrentSolution();
solution = MergeChanges(solution, _lastMutatedSolution); solution = MergeChanges(solution, _lastMutatedSolution);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册