diff --git a/src/Features/LanguageServer/Protocol/Handler/Completion/CompletionResolveHandler.cs b/src/Features/LanguageServer/Protocol/Handler/Completion/CompletionResolveHandler.cs index 02bc113202337..8eaa6a5a2ee24 100644 --- a/src/Features/LanguageServer/Protocol/Handler/Completion/CompletionResolveHandler.cs +++ b/src/Features/LanguageServer/Protocol/Handler/Completion/CompletionResolveHandler.cs @@ -80,8 +80,11 @@ await creationService.ResolveAsync( private static bool MatchesLSPCompletionItem(LSP.CompletionItem lspCompletionItem, CompletionItem completionItem) { + // We want to make sure we are resolving the same unimported item in case we have multiple with same name + // but from different namespaces. However, VSCode doesn't include labelDetails in the resolve request, so we + // compare SortText instead when it's set (which is when label != SortText) return lspCompletionItem.Label == completionItem.GetEntireDisplayText() - && (lspCompletionItem.LabelDetails?.Description ?? string.Empty) == completionItem.InlineDescription; + && (lspCompletionItem.SortText is null || lspCompletionItem.SortText == completionItem.SortText); } private CompletionListCache.CacheEntry? GetCompletionListCacheEntry(LSP.CompletionItem request) diff --git a/src/Features/LanguageServer/ProtocolUnitTests/Completion/CompletionFeaturesTests.cs b/src/Features/LanguageServer/ProtocolUnitTests/Completion/CompletionFeaturesTests.cs index 6a254a2455d57..6038ede9dcc07 100644 --- a/src/Features/LanguageServer/ProtocolUnitTests/Completion/CompletionFeaturesTests.cs +++ b/src/Features/LanguageServer/ProtocolUnitTests/Completion/CompletionFeaturesTests.cs @@ -540,6 +540,10 @@ void M() itemFromNS1.Data = completionResult.ItemDefaults.Data; itemFromNS2.Data = completionResult.ItemDefaults.Data; + // Remove the label details as this is the behavior of the VSCode client when resolving completion items. + itemFromNS1.LabelDetails = null; + itemFromNS2.LabelDetails = null; + var resolvedItem1 = await testLspServer.ExecuteRequestAsync(LSP.Methods.TextDocumentCompletionResolveName, itemFromNS1, CancellationToken.None).ConfigureAwait(false); Assert.Equal("Namespace1", resolvedItem1.LabelDetails.Description); Assert.Equal("~MyClass Namespace1", resolvedItem1.SortText);