diff --git a/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/OverrideCompletionProviderTests.cs b/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/OverrideCompletionProviderTests.cs index 0f8f420d3c7e05ab10af8fe894fe52b5c7af4893..a82fbc4ee3152ddb4602138a81cddc027f6a3268 100644 --- a/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/OverrideCompletionProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/OverrideCompletionProviderTests.cs @@ -2744,7 +2744,7 @@ public override void M(in int x) var completionList = await GetCompletionListAsync(service, document, testDocument.CursorPosition.Value, CompletionTrigger.Invoke); var completionItem = completionList.Items.Where(c => c.DisplayText == "M(in int x)").Single(); - var commit = await service.GetChangeAsync(document, completionItem, commitKey: null, CancellationToken.None); + var commit = await service.GetChangeAsync(document, completionItem, completionList.Span, commitKey: null, CancellationToken.None); var text = await document.GetTextAsync(); var newText = text.WithChanges(commit.TextChange); diff --git a/src/EditorFeatures/TestUtilities/Completion/AbstractCompletionProviderTests.cs b/src/EditorFeatures/TestUtilities/Completion/AbstractCompletionProviderTests.cs index cc0494f271b7df617ae43219e962476ba9cd68a3..f37673a15080fd1ddf5a4d947fcca1a5b0a7f6ff 100644 --- a/src/EditorFeatures/TestUtilities/Completion/AbstractCompletionProviderTests.cs +++ b/src/EditorFeatures/TestUtilities/Completion/AbstractCompletionProviderTests.cs @@ -339,7 +339,8 @@ private async Task VerifyCustomCommitProviderCheckResultsAsync(Document document var textBuffer = WorkspaceFixture.CurrentDocument.TextBuffer; var service = GetCompletionService(workspace); - var items = (await GetCompletionListAsync(service, document, position, RoslynCompletion.CompletionTrigger.Invoke)).Items; + var completionLlist = await GetCompletionListAsync(service, document, position, RoslynCompletion.CompletionTrigger.Invoke); + var items = completionLlist.Items; var firstItem = items.First(i => CompareItems(i.DisplayText, itemToCommit)); if (service.GetTestAccessor().ExclusiveProviders?[0] is ICustomCommitCompletionProvider customCommitCompletionProvider) @@ -350,7 +351,7 @@ private async Task VerifyCustomCommitProviderCheckResultsAsync(Document document } else { - await VerifyCustomCommitWorkerAsync(service, document, firstItem, codeBeforeCommit, expectedCodeAfterCommit, commitChar); + await VerifyCustomCommitWorkerAsync(service, document, firstItem, completionLlist.Span, codeBeforeCommit, expectedCodeAfterCommit, commitChar); } } @@ -362,6 +363,7 @@ protected virtual void SetWorkspaceOptions(TestWorkspace workspace) CompletionServiceWithProviders service, Document document, RoslynCompletion.CompletionItem completionItem, + TextSpan completionListSpan, string codeBeforeCommit, string expectedCodeAfterCommit, char? commitChar = null) @@ -379,7 +381,7 @@ protected virtual void SetWorkspaceOptions(TestWorkspace workspace) // changes to document, so the cursor position is tracked correctly. var textView = WorkspaceFixture.CurrentDocument.GetTextView(); - var commit = await service.GetChangeAsync(document, completionItem, commitChar, CancellationToken.None); + var commit = await service.GetChangeAsync(document, completionItem, completionListSpan, commitChar, CancellationToken.None); var text = await document.GetTextAsync(); var newText = text.WithChanges(commit.TextChange); @@ -452,7 +454,8 @@ protected virtual void SetWorkspaceOptions(TestWorkspace workspace) var textSnapshot = textBuffer.CurrentSnapshot.AsText(); var service = GetCompletionService(workspace); - var items = (await GetCompletionListAsync(service, document, position, RoslynCompletion.CompletionTrigger.Invoke)).Items; + var completionList = await GetCompletionListAsync(service, document, position, RoslynCompletion.CompletionTrigger.Invoke); + var items = completionList.Items; var firstItem = items.First(i => CompareItems(i.DisplayText + i.DisplayTextSuffix, itemToCommit)); var completionRules = GetCompletionHelper(document); @@ -463,7 +466,7 @@ protected virtual void SetWorkspaceOptions(TestWorkspace workspace) if (commitChar == '\t' || CommitManager.IsCommitCharacter(service.GetRules(), firstItem, commitChar, textTypedSoFar + commitChar)) { - var textChange = (await service.GetChangeAsync(document, firstItem, commitChar, CancellationToken.None)).TextChange; + var textChange = (await service.GetChangeAsync(document, firstItem, completionList.Span, commitChar, CancellationToken.None)).TextChange; // Adjust TextChange to include commit character, so long as it isn't TAB. if (commitChar != '\t') diff --git a/src/Features/Core/Portable/Completion/Providers/AbstractTypeImportCompletionProvider.cs b/src/Features/Core/Portable/Completion/Providers/AbstractTypeImportCompletionProvider.cs index 87799bda7632ff1fc78a47445f222c5c07e8f097..bbecd168a9b2904aa1bc6cd755f339dfbc9595e4 100644 --- a/src/Features/Core/Portable/Completion/Providers/AbstractTypeImportCompletionProvider.cs +++ b/src/Features/Core/Portable/Completion/Providers/AbstractTypeImportCompletionProvider.cs @@ -157,7 +157,7 @@ private HashSet GetNamespacesInScope(Document document, SyntaxContext sy return namespacesInScope; } - public override async Task GetChangeAsync(Document document, CompletionItem completionItem, char? commitKey = default, CancellationToken cancellationToken = default) + internal override async Task GetChangeAsync(Document document, CompletionItem completionItem, TextSpan completionListSpan, char? commitKey, CancellationToken cancellationToken) { var containingNamespace = TypeImportCompletionItem.GetContainingNamespace(completionItem); Debug.Assert(containingNamespace != null); @@ -167,7 +167,7 @@ public override async Task GetChangeAsync(Document document, C // Find context node so we can use it to decide where to insert using/imports. var tree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); var root = await tree.GetRootAsync(cancellationToken).ConfigureAwait(false); - var addImportContextNode = root.FindToken(completionItem.Span.Start, findInsideTrivia: true).Parent; + var addImportContextNode = root.FindToken(completionListSpan.Start, findInsideTrivia: true).Parent; // Add required using/imports directive. var addImportService = document.GetLanguageService(); @@ -198,7 +198,7 @@ public override async Task GetChangeAsync(Document document, C // above, we will get a TextChange of "AsnEncodedDat" with 0 length span, instead of a change of // the full display text with a span of length 1. This will later mess up span-tracking and end up // with "AsnEncodedDatasd" in the code. - builder.Add(new TextChange(completionItem.Span, completionItem.DisplayText)); + builder.Add(new TextChange(completionListSpan, completionItem.DisplayText)); // Then get the combined change var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false); @@ -211,7 +211,7 @@ public override async Task GetChangeAsync(Document document, C // For workspace that doesn't support document change, e.g. DebuggerIntellisense // we complete the type name in its fully qualified form instead. var fullyQualifiedName = containingNamespace + completionItem.DisplayText; - var change = new TextChange(completionItem.Span, fullyQualifiedName); + var change = new TextChange(completionListSpan, fullyQualifiedName); return CompletionChange.Create(change); } diff --git a/src/Features/Core/Portable/SpellCheck/AbstractSpellCheckCodeFixProvider.cs b/src/Features/Core/Portable/SpellCheck/AbstractSpellCheckCodeFixProvider.cs index b2d5867237998ac5259df9f0d2b13e7abe5d30c0..0923cfe467f78032623e71e42d3864417c28c7aa 100644 --- a/src/Features/Core/Portable/SpellCheck/AbstractSpellCheckCodeFixProvider.cs +++ b/src/Features/Core/Portable/SpellCheck/AbstractSpellCheckCodeFixProvider.cs @@ -153,7 +153,7 @@ private async Task CheckTokenAsync(CodeFixContext context, Document document, Sy continue; } - var insertionText = await GetInsertionTextAsync(document, item, cancellationToken: cancellationToken).ConfigureAwait(false); + var insertionText = await GetInsertionTextAsync(document, item, completionList.Span, cancellationToken: cancellationToken).ConfigureAwait(false); results.Add(matchCost, insertionText); } @@ -178,10 +178,10 @@ private async Task CheckTokenAsync(CodeFixContext context, Document document, Sy } } - private async Task GetInsertionTextAsync(Document document, CompletionItem item, CancellationToken cancellationToken) + private async Task GetInsertionTextAsync(Document document, CompletionItem item, TextSpan completionListSpan, CancellationToken cancellationToken) { var service = CompletionService.GetService(document); - var change = await service.GetChangeAsync(document, item, null, cancellationToken).ConfigureAwait(false); + var change = await service.GetChangeAsync(document, item, completionListSpan, commitCharacter: null, cancellationToken).ConfigureAwait(false); return change.TextChange.NewText; }