diff --git a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Presentation/CustomCommitCompletion.cs b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Presentation/CustomCommitCompletion.cs index abcc9e766e1f94ff2f818cf9eac3d0deabd2f830..861a15d46f82cff94d952d8000cc1519e5065b1f 100644 --- a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Presentation/CustomCommitCompletion.cs +++ b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Presentation/CustomCommitCompletion.cs @@ -19,10 +19,12 @@ internal sealed class CustomCommitCompletion : Completion3, ICustomCommit private readonly CompletionPresenterSession _completionPresenterSession; internal readonly CompletionItem CompletionItem; private readonly ImageMoniker _imageMoniker; + private readonly string _displayText; public CustomCommitCompletion( CompletionPresenterSession completionPresenterSession, - CompletionItem completionItem) + CompletionItem completionItem, + string displayText) { // PERF: Note that the base class contains a constructor taking the displayText string // but we're intentionally NOT using that here because it allocates a private CompletionState @@ -30,6 +32,7 @@ internal sealed class CustomCommitCompletion : Completion3, ICustomCommit // extra allocation is avoided. _completionPresenterSession = completionPresenterSession; this.CompletionItem = completionItem; + _displayText = displayText ?? completionItem.DisplayText; _imageMoniker = ImageMonikers.GetImageMoniker(CompletionItem.Tags); } @@ -41,15 +44,9 @@ public void Commit() _completionPresenterSession.OnCompletionItemCommitted(CompletionItem); } - public override string DisplayText => this.CompletionItem.DisplayText; + public override string DisplayText => _displayText; - public override string InsertionText - { - get - { - return this.DisplayText; // [sic] Same as DisplayText - } - } + public override string InsertionText => DisplayText; public override string Description { diff --git a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Presentation/Roslyn14CompletionSet.cs b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Presentation/Roslyn14CompletionSet.cs index 051fa7415ad366e81e53f5a63b74d61cdfa97102..44c8cf37c0a983ada57d6955170ce32c4a2269c6 100644 --- a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Presentation/Roslyn14CompletionSet.cs +++ b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/Presentation/Roslyn14CompletionSet.cs @@ -69,52 +69,51 @@ public void SetTrackingSpan(ITrackingSpan trackingSpan) { this.AssertIsForeground(); - VSCompletion selectedCompletionItem = null; - // Initialize the completion map to a reasonable default initial size (+1 for the builder) CompletionItemMap = CompletionItemMap ?? new Dictionary(completionItems.Count + 1); FilterText = filterText; SuggestionModeItem = suggestionModeItem; + this.SetupFilters(completionItemFilters); + + CreateCompletionListBuilder(selectedItem, suggestionModeItem, suggestionMode); + CreateNormalCompletionListItems(completionItems); + + var selectedCompletionItem = GetVSCompletion(selectedItem); + VsCompletionSet.SelectionStatus = new CompletionSelectionStatus( + selectedCompletionItem, + isSelected: !isSoftSelected, isUnique: selectedCompletionItem != null); + } + + private void CreateCompletionListBuilder( + CompletionItem selectedItem, + CompletionItem suggestionModeItem, + bool suggestionMode) + { try { VsCompletionSet.WritableCompletionBuilders.BeginBulkOperation(); VsCompletionSet.WritableCompletionBuilders.Clear(); - this.SetupFilters(completionItemFilters); - - var applicableToText = VsCompletionSet.ApplicableTo.GetText( - VsCompletionSet.ApplicableTo.TextBuffer.CurrentSnapshot); - - CompletionItem filteredSuggestionModeItem = null; - if (selectedItem != null) + if (suggestionMode) { - var completionItem = CompletionItem.Create(displayText: applicableToText); - completionItem.Span = VsCompletionSet.ApplicableTo.GetSpan( - VsCompletionSet.ApplicableTo.TextBuffer.CurrentSnapshot).Span.ToTextSpan(); + var applicableToText = VsCompletionSet.ApplicableTo.GetText( + VsCompletionSet.ApplicableTo.TextBuffer.CurrentSnapshot); - filteredSuggestionModeItem = completionItem; - } - - var showBuilder = suggestionMode || suggestionModeItem != null; - var bestSuggestionModeItem = applicableToText.Length > 0 ? filteredSuggestionModeItem : suggestionModeItem ?? filteredSuggestionModeItem; - - if (showBuilder && bestSuggestionModeItem != null) - { - var suggestionModeCompletion = GetVSCompletion(bestSuggestionModeItem); - VsCompletionSet.WritableCompletionBuilders.Add(suggestionModeCompletion); - - if (selectedItem != null && selectedItem == suggestionModeItem) - { - selectedCompletionItem = suggestionModeCompletion; - } + var text = applicableToText.Length > 0 ? applicableToText : suggestionModeItem.DisplayText; + var vsCompletion = GetVSCompletion(suggestionModeItem, text); + + VsCompletionSet.WritableCompletionBuilders.Add(vsCompletion); } } finally { VsCompletionSet.WritableCompletionBuilders.EndBulkOperation(); } + } + private void CreateNormalCompletionListItems(IList completionItems) + { try { VsCompletionSet.WritableCompletions.BeginBulkOperation(); @@ -124,32 +123,24 @@ public void SetTrackingSpan(ITrackingSpan trackingSpan) { var completionItem = GetVSCompletion(item); VsCompletionSet.WritableCompletions.Add(completionItem); - - if (item == selectedItem) - { - selectedCompletionItem = completionItem; - } } } finally { VsCompletionSet.WritableCompletions.EndBulkOperation(); } - - VsCompletionSet.SelectionStatus = new CompletionSelectionStatus( - selectedCompletionItem, isSelected: !isSoftSelected, isUnique: selectedCompletionItem != null); } protected virtual void SetupFilters(ImmutableArray completionItemFilters) { } - private VSCompletion GetVSCompletion(CompletionItem item) + private VSCompletion GetVSCompletion(CompletionItem item, string displayText = null) { VSCompletion value; if (!CompletionItemMap.TryGetValue(item, out value)) { - value = new CustomCommitCompletion(CompletionPresenterSession, item); + value = new CustomCommitCompletion(CompletionPresenterSession, item, displayText); CompletionItemMap.Add(item, value); }