提交 e49f2a44 编写于 作者: C CyrusNajmabadi

Simplify creation of presentation items.

上级 d370801e
......@@ -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
{
......
......@@ -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<CompletionItem, VSCompletion>(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<CompletionItem> 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<CompletionItemFilter> 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);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册