提交 0b1ea2ca 编写于 作者: C CyrusNajmabadi

Simplify how we go from a text-snapshot to a document in lightbulbs.

After investigating with jason, we've concluded this strange code was written
back in the days where roslyn workspaces and VS documents were not something
you could trust to be in sync.  So we had to have a lot of painful code to try
to detect and bail out when that happened.  This is definitely not necessary
now, and we can just use the simple and correct function we already hve for this
task.
上级 d9254bc1
......@@ -113,7 +113,7 @@ public bool TryGetTelemetryId(out Guid telemetryId)
using (Logger.LogBlock(FunctionId.SuggestedActions_GetSuggestedActions, cancellationToken))
{
var document = GetMatchingDocumentAsync(range.Snapshot, cancellationToken).WaitAndGetResult(cancellationToken);
var document = range.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
if (document == null)
{
// this is here to fail test and see why it is failed.
......@@ -288,7 +288,7 @@ private bool IsApplicable(CodeAction action, Workspace workspace)
if (!action.PerformFinalApplicabilityCheck)
{
// If we don't even need to perform the final applicability check,
// then the code actoin is applicable.
// then the code action is applicable.
return true;
}
......@@ -588,7 +588,10 @@ private static SuggestedActionSetPriority GetSuggestedActionSetPriority(CodeActi
applicableSpan);
}
public async Task<bool> HasSuggestedActionsAsync(ISuggestedActionCategorySet requestedActionCategories, SnapshotSpan range, CancellationToken cancellationToken)
public async Task<bool> HasSuggestedActionsAsync(
ISuggestedActionCategorySet requestedActionCategories,
SnapshotSpan range,
CancellationToken cancellationToken)
{
// Explicitly hold onto below fields in locals and use these locals throughout this code path to avoid crashes
// if these fields happen to be cleared by Dispose() below. This is required since this code path involves
......@@ -604,7 +607,7 @@ public async Task<bool> HasSuggestedActionsAsync(ISuggestedActionCategorySet req
using (var asyncToken = provider.OperationListener.BeginAsyncOperation("HasSuggestedActionsAsync"))
{
var document = await GetMatchingDocumentAsync(range.Snapshot, cancellationToken).ConfigureAwait(false);
var document = range.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
if (document == null)
{
// this is here to fail test and see why it is failed.
......@@ -722,44 +725,6 @@ public async Task<bool> HasSuggestedActionsAsync(ISuggestedActionCategorySet req
return translatedSpan.Span.ToTextSpan();
}
private static async Task<Document> GetMatchingDocumentAsync(ITextSnapshot givenSnapshot, CancellationToken cancellationToken)
{
var buffer = givenSnapshot.TextBuffer;
if (buffer == null)
{
return null;
}
var workspace = buffer.GetWorkspace();
if (workspace == null)
{
return null;
}
var documentId = workspace.GetDocumentIdInCurrentContext(buffer.AsTextContainer());
if (documentId == null)
{
return null;
}
var document = workspace.CurrentSolution.GetDocument(documentId);
if (document == null)
{
return null;
}
var sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested();
var snapshot = sourceText.FindCorrespondingEditorTextSnapshot();
if (snapshot == null || snapshot.Version.ReiteratedVersionNumber != givenSnapshot.Version.ReiteratedVersionNumber)
{
return null;
}
return document;
}
private void OnTextViewClosed(object sender, EventArgs e)
{
Dispose();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册