提交 066c8a44 编写于 作者: G Gen Lu

Fix ItemManager to handler expander

上级 f1a5628e
......@@ -114,10 +114,14 @@ internal ItemManager(RecentItemsManager recentItemsManager)
// We need to filter if
// 1. a non-empty strict subset of filters are selected
// 2. any unselected expander exists
var selectedNonExpanderFilters = data.SelectedFilters.Where(f => f.IsSelected).Select(f => f.Filter).Where(f => !(f is CompletionExpander)).ToImmutableArray();
var unselectedExpanders = data.SelectedFilters.Where(f => f.Filter is CompletionExpander && !f.IsSelected).Select(f => f.Filter).ToImmutableArray();
var needToFilter = selectedNonExpanderFilters.Length > 0 && selectedNonExpanderFilters.Length < data.SelectedFilters.Length;
// 2. a non-empty set of expanders are unselected
var nonExpanderFilterStates = data.SelectedFilters.Where(f => !(f.Filter is CompletionExpander)).ToImmutableArray();
var selectedNonExpanderFilters = nonExpanderFilterStates.Where(f => f.IsSelected).Select(f => f.Filter).ToImmutableArray();
var needToFilter = selectedNonExpanderFilters.Length > 0 && selectedNonExpanderFilters.Length < nonExpanderFilterStates.Length;
var unselectedExpanders = data.SelectedFilters.Where(f => !f.IsSelected).Select(f => f.Filter).Where(f => f is CompletionExpander).ToImmutableArray();
var needToFilterExpanded = unselectedExpanders.Length > 0;
if (session.TextView.Properties.TryGetProperty(CompletionSource.TargetTypeFilterExperimentEnabled, out bool isExperimentEnabled) && isExperimentEnabled)
{
......@@ -156,10 +160,7 @@ internal ItemManager(RecentItemsManager recentItemsManager)
continue;
}
// TODO: Putting expander in filter list might affect perf, even no expander is selected.
// Since we are creating a editor owned special expander, we should consider making
// it a independent property on VS CompletionItem.
if (unselectedExpanders.Length > 0 && ShouldBeFilteredOutOfExpandedCompletionList(item, unselectedExpanders))
if (needToFilterExpanded && ShouldBeFilteredOutOfExpandedCompletionList(item, unselectedExpanders))
{
continue;
}
......@@ -247,6 +248,43 @@ internal ItemManager(RecentItemsManager recentItemsManager)
highlightedList,
completionHelper,
hasSuggestedItemOptions);
static bool ShouldBeFilteredOutOfCompletionList(VSCompletionItem item, ImmutableArray<CompletionFilter> activeNonExpanderFilters)
{
foreach (var itemFilter in item.Filters)
{
if (activeNonExpanderFilters.Contains(itemFilter))
{
return false;
}
}
return true;
}
static bool ShouldBeFilteredOutOfExpandedCompletionList(VSCompletionItem item, ImmutableArray<CompletionFilter> unselectedExpanders)
{
var associatedWithUnselectedExpander = false;
foreach (var itemFilter in item.Filters)
{
if (itemFilter is CompletionExpander)
{
if (!unselectedExpanders.Contains(itemFilter))
{
// If any of the associated expander is selected, the item should be included in the expanded list.
return false;
}
associatedWithUnselectedExpander = true;
}
}
// at this point, the item either:
// 1. has no expander filter, therefore should be included
// 2, or, all associated expanders are unselected, therefore should be excluded
return associatedWithUnselectedExpander;
}
}
private static bool IsAfterDot(ITextSnapshot snapshot, ITrackingSpan applicableToSpan)
......@@ -460,44 +498,6 @@ private static bool IsAfterDot(ITextSnapshot snapshot, ITrackingSpan applicableT
return ImmutableArray.CreateRange(filters.Select(n => n.WithAvailability(n.Filter is CompletionExpander ? true : textFilteredFilters.Contains(n.Filter))));
}
private static bool ShouldBeFilteredOutOfCompletionList(VSCompletionItem item, ImmutableArray<CompletionFilter> activeNonExpanderFilters)
{
Debug.Assert(!activeNonExpanderFilters.Any(f => f is CompletionExpander));
foreach (var itemFilter in item.Filters)
{
if (activeNonExpanderFilters.Contains(itemFilter))
{
return false;
}
}
return true;
}
private static bool ShouldBeFilteredOutOfExpandedCompletionList(VSCompletionItem item, ImmutableArray<CompletionFilter> unselectedExpanders)
{
var associatedWithUnselectedExpander = false;
foreach (var itemFilter in item.Filters)
{
if (itemFilter is CompletionExpander)
{
if (!unselectedExpanders.Contains(itemFilter))
{
// If any of the associated expander is selected, the item should be included in the expanded list.
return false;
}
associatedWithUnselectedExpander = true;
}
}
// at this point, the item either:
// 1. has no expander filter, therefore should be included
// 2, or, all associated expanders are unselected, therefore should be excluded
return associatedWithUnselectedExpander;
}
/// <summary>
/// Given multiple possible chosen completion items, pick the one that has the
/// best MRU index.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册