From e6f0b36e107c5d1d8231c100221eceac9e95866a Mon Sep 17 00:00:00 2001 From: "gel@microsoft.com" Date: Wed, 23 Feb 2022 16:24:05 -0800 Subject: [PATCH] Revert change to a CompletionItem property which pythia depends on Also add required helpers so we can remove the dependency --- .../IntelliSense/AsyncCompletion/CompletionSource.cs | 2 +- .../Handlers/Completion/CompletionHandler.cs | 4 +--- .../CompletionProviders/CrefCompletionProvider.cs | 2 +- .../Core/Portable/Completion/CommonCompletionItem.cs | 1 - .../Completion/Providers/SymbolCompletionItem.cs | 10 ++++++++-- .../Pythia/Api/PythiaCompletionProviderBase.cs | 9 +++++++-- 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/EditorFeatures/Core/Implementation/IntelliSense/AsyncCompletion/CompletionSource.cs b/src/EditorFeatures/Core/Implementation/IntelliSense/AsyncCompletion/CompletionSource.cs index 5603b0d71f2be..97b93cf5a2fd7 100644 --- a/src/EditorFeatures/Core/Implementation/IntelliSense/AsyncCompletion/CompletionSource.cs +++ b/src/EditorFeatures/Core/Implementation/IntelliSense/AsyncCompletion/CompletionSource.cs @@ -558,7 +558,7 @@ private VSCompletionItem Convert( // roslynItem generated by providers can contain an insertionText in a property bag. // We will not use it but other providers may need it. // We actually will calculate the insertion text once again when called TryCommit. - if (!roslynItem.Properties.TryGetValue(CommonCompletionItem.InsertionTextProperty, out var insertionText)) + if (!SymbolCompletionItem.TryGetInsertionText(roslynItem, out var insertionText)) { insertionText = roslynItem.DisplayText; } diff --git a/src/EditorFeatures/Core/Implementation/LanguageServer/Handlers/Completion/CompletionHandler.cs b/src/EditorFeatures/Core/Implementation/LanguageServer/Handlers/Completion/CompletionHandler.cs index eeb5cd2079a70..5f9b25e1deb8d 100644 --- a/src/EditorFeatures/Core/Implementation/LanguageServer/Handlers/Completion/CompletionHandler.cs +++ b/src/EditorFeatures/Core/Implementation/LanguageServer/Handlers/Completion/CompletionHandler.cs @@ -260,9 +260,7 @@ static async Task CreateCompletionItemAsync( // If the feature flag is off, return an InsertText. else { - completionItem.InsertText = item.Properties.ContainsKey(CommonCompletionItem.InsertionTextProperty) - ? item.Properties[CommonCompletionItem.InsertionTextProperty] - : completeDisplayText; + completionItem.InsertText = SymbolCompletionItem.TryGetInsertionText(item, out var insertionText) ? insertionText : completeDisplayText; } var commitCharacters = GetCommitCharacters(item, commitCharacterRulesCache, supportsVSExtensions); diff --git a/src/Features/CSharp/Portable/Completion/CompletionProviders/CrefCompletionProvider.cs b/src/Features/CSharp/Portable/Completion/CompletionProviders/CrefCompletionProvider.cs index 7d3964708e97e..b54ec7bf944ea 100644 --- a/src/Features/CSharp/Portable/Completion/CompletionProviders/CrefCompletionProvider.cs +++ b/src/Features/CSharp/Portable/Completion/CompletionProviders/CrefCompletionProvider.cs @@ -419,7 +419,7 @@ private static CompletionItemRules GetRules(string displayText) protected override Task GetTextChangeAsync(CompletionItem selectedItem, char? ch, CancellationToken cancellationToken) { - if (!selectedItem.Properties.TryGetValue(CommonCompletionItem.InsertionTextProperty, out var insertionText)) + if (!SymbolCompletionItem.TryGetInsertionText(selectedItem, out var insertionText)) { insertionText = selectedItem.DisplayText; } diff --git a/src/Features/Core/Portable/Completion/CommonCompletionItem.cs b/src/Features/Core/Portable/Completion/CommonCompletionItem.cs index 4a5a720b8ccb0..57d1b58dc29f3 100644 --- a/src/Features/Core/Portable/Completion/CommonCompletionItem.cs +++ b/src/Features/Core/Portable/Completion/CommonCompletionItem.cs @@ -12,7 +12,6 @@ namespace Microsoft.CodeAnalysis.Completion internal static class CommonCompletionItem { public const string DescriptionProperty = nameof(DescriptionProperty); - public const string InsertionTextProperty = nameof(InsertionTextProperty); public static CompletionItem Create( string displayText, diff --git a/src/Features/Core/Portable/Completion/Providers/SymbolCompletionItem.cs b/src/Features/Core/Portable/Completion/Providers/SymbolCompletionItem.cs index c8f90f98d8176..09e9cfd965db1 100644 --- a/src/Features/Core/Portable/Completion/Providers/SymbolCompletionItem.cs +++ b/src/Features/Core/Portable/Completion/Providers/SymbolCompletionItem.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -17,6 +18,8 @@ namespace Microsoft.CodeAnalysis.Completion.Providers { internal static partial class SymbolCompletionItem { + private const string InsertionTextProperty = "InsertionText"; + private static readonly Func, CompletionItem, CompletionItem> s_addSymbolEncoding = AddSymbolEncoding; private static readonly Func, CompletionItem, CompletionItem> s_addSymbolInfo = AddSymbolInfo; private static readonly char[] s_projectSeperators = new[] { ';' }; @@ -43,7 +46,7 @@ private static CompletionItem CreateWorker( if (insertionText != null) { - props = props.Add(CommonCompletionItem.InsertionTextProperty, insertionText); + props = props.Add(InsertionTextProperty, insertionText); } props = props.Add("ContextPosition", contextPosition.ToString()); @@ -254,7 +257,10 @@ public static int GetDescriptionPosition(CompletionItem item) => GetContextPosition(item); public static string GetInsertionText(CompletionItem item) - => item.Properties[CommonCompletionItem.InsertionTextProperty]; + => item.Properties[InsertionTextProperty]; + + public static bool TryGetInsertionText(CompletionItem item, [NotNullWhen(true)] out string? insertionText) + => item.Properties.TryGetValue(InsertionTextProperty, out insertionText); // COMPAT OVERLOAD: This is used by IntelliCode. public static CompletionItem CreateWithSymbolId( diff --git a/src/Features/Core/Portable/ExternalAccess/Pythia/Api/PythiaCompletionProviderBase.cs b/src/Features/Core/Portable/ExternalAccess/Pythia/Api/PythiaCompletionProviderBase.cs index f14cb3063a358..df81dc44e1856 100644 --- a/src/Features/Core/Portable/ExternalAccess/Pythia/Api/PythiaCompletionProviderBase.cs +++ b/src/Features/Core/Portable/ExternalAccess/Pythia/Api/PythiaCompletionProviderBase.cs @@ -4,12 +4,12 @@ using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.Completion; using Microsoft.CodeAnalysis.Completion.Providers; using Microsoft.CodeAnalysis.LanguageServices; -using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Shared.Utilities; namespace Microsoft.CodeAnalysis.ExternalAccess.Pythia.Api @@ -48,11 +48,16 @@ public static ImmutableArray CreateRecommendedKeywordDisplayP => RecommendedKeyword.CreateDisplayParts(keyword, toolTip); public static Task GetDescriptionAsync(CompletionItem item, Document document, SymbolDescriptionOptions displayOptions, CancellationToken cancellationToken) - => SymbolCompletionItem.GetDescriptionAsync(item, document, displayOptions, cancellationToken); + => SymbolCompletionItem.HasSymbols(item) + ? SymbolCompletionItem.GetDescriptionAsync(item, document, displayOptions, cancellationToken) + : Task.FromResult(CommonCompletionItem.GetDescription(item)); public static CompletionDescription GetDescription(CompletionItem item) => CommonCompletionItem.GetDescription(item); + public static bool TryGetInsertionText(CompletionItem item, [NotNullWhen(true)]out string? insertionText) + => SymbolCompletionItem.TryGetInsertionText(item, out insertionText); + public override Task GetChangeAsync(Document document, CompletionItem item, char? commitKey = null, CancellationToken cancellationToken = default) => base.GetChangeAsync(document, item, commitKey, cancellationToken);