diff --git a/src/Features/LanguageServer/Protocol/Handler/Completion/CompletionHandler.cs b/src/Features/LanguageServer/Protocol/Handler/Completion/CompletionHandler.cs index 1137ad3695b060279b9540cffc4b13fcfb558826..e42d38dbb1e05400e283e2231791b9b6b1b127a6 100644 --- a/src/Features/LanguageServer/Protocol/Handler/Completion/CompletionHandler.cs +++ b/src/Features/LanguageServer/Protocol/Handler/Completion/CompletionHandler.cs @@ -11,6 +11,7 @@ using Microsoft.CodeAnalysis.Completion; using Microsoft.CodeAnalysis.Editor.Shared.Extensions; using Microsoft.CodeAnalysis.LanguageServer.CustomProtocol; +using Microsoft.CodeAnalysis.Options; using Microsoft.VisualStudio.Text.Adornments; using LSP = Microsoft.VisualStudio.LanguageServer.Protocol; @@ -34,14 +35,23 @@ internal class CompletionHandler : IRequestHandler var position = await document.GetPositionFromLinePositionAsync(ProtocolConversions.PositionToLinePosition(request.Position), cancellationToken).ConfigureAwait(false); + // Filter out unimported types for now as there are two issues with providing them: + // 1. LSP client does not currently provide a way to provide detail text on the completion item to show the namespace. + // https://dev.azure.com/devdiv/DevDiv/_workitems/edit/1076759 + // 2. We need to figure out how to provide the text edits along with the completion item or provide them in the resolve request. + // https://devdiv.visualstudio.com/DevDiv/_workitems/edit/985860/ + var documentOptions = await document.GetOptionsAsync(cancellationToken).ConfigureAwait(false); + var completionOptions = documentOptions.WithChangedOption(CompletionServiceOptions.IsExpandedCompletion, false); + var completionService = document.Project.LanguageServices.GetService(); - var list = await completionService.GetCompletionsAsync(document, position, cancellationToken: cancellationToken).ConfigureAwait(false); + var list = await completionService.GetCompletionsAsync(document, position, options: completionOptions, cancellationToken: cancellationToken).ConfigureAwait(false); if (list == null) { return Array.Empty(); } var lspVSClientCapability = clientCapabilities?.HasVisualStudioLspCapability() == true; + return list.Items.Select(item => CreateLSPCompletionItem(request, item, lspVSClientCapability)).ToArray(); // local functions diff --git a/src/Features/LanguageServer/ProtocolUnitTests/Completion/CompletionTests.cs b/src/Features/LanguageServer/ProtocolUnitTests/Completion/CompletionTests.cs index 63470dd2999f7bfe4f4d1523fa80b59ec7d556b3..db6dfdee3b6f585d4734f41de36e412f2bf20fc3 100644 --- a/src/Features/LanguageServer/ProtocolUnitTests/Completion/CompletionTests.cs +++ b/src/Features/LanguageServer/ProtocolUnitTests/Completion/CompletionTests.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.CodeAnalysis.Completion; using Roslyn.Test.Utilities; using Xunit; using LSP = Microsoft.VisualStudio.LanguageServer.Protocol; @@ -32,6 +33,30 @@ void M() AssertJsonEquals(expected, results.First()); } + [Fact] + public async Task TestGetCompletionsDoesNotIncludeUnimportedTypesAsync() + { + var markup = +@"class A +{ + void M() + { + {|caret:|} + } +}"; + var (solution, locations) = CreateTestSolution(markup); + + // Make sure the unimported types option is on by default. + solution = solution.WithOptions(solution.Options.WithChangedOption(CompletionServiceOptions.IsExpandedCompletion, true)); + + var expected = CreateCompletionItem("A", LSP.CompletionItemKind.Class, new string[] { "Class", "Internal" }, CreateCompletionParams(locations["caret"].Single())); + var clientCapabilities = new LSP.VSClientCapabilities { SupportsVisualStudioExtensions = true }; + + var results = (LSP.CompletionItem[])await RunGetCompletionsAsync(solution, locations["caret"].Single(), clientCapabilities); + + Assert.False(results.Any(item => "Console" == item.Label)); + } + private static async Task RunGetCompletionsAsync(Solution solution, LSP.Location caret, LSP.ClientCapabilities clientCapabilities = null) => await GetLanguageServer(solution).GetCompletionsAsync(solution, CreateCompletionParams(caret), clientCapabilities, CancellationToken.None); }