Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
f1a5628e
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f1a5628e
编写于
6月 05, 2019
作者:
G
Gen Lu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix ItemManager to handle expander
上级
31b3f475
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
46 addition
and
11 deletion
+46
-11
src/EditorFeatures/Core/Implementation/IntelliSense/AsyncCompletion/ItemManager.cs
...mplementation/IntelliSense/AsyncCompletion/ItemManager.cs
+46
-11
未找到文件。
src/EditorFeatures/Core/Implementation/IntelliSense/AsyncCompletion/ItemManager.cs
浏览文件 @
f1a5628e
...
...
@@ -9,8 +9,6 @@
using
System.Threading
;
using
System.Threading.Tasks
;
using
Microsoft.CodeAnalysis.Completion
;
using
Microsoft.CodeAnalysis.Experiments
;
using
Microsoft.CodeAnalysis.Internal.Log
;
using
Microsoft.CodeAnalysis.Shared.Extensions
;
using
Microsoft.CodeAnalysis.Text
;
using
Microsoft.CodeAnalysis.Text.Shared.Extensions
;
...
...
@@ -114,16 +112,19 @@ internal ItemManager(RecentItemsManager recentItemsManager)
}
}
// We need to filter if a non-empty strict subset of filters are selected
var
selectedFilters
=
data
.
SelectedFilters
.
Where
(
f
=>
f
.
IsSelected
).
Select
(
f
=>
f
.
Filter
).
ToImmutableArray
();
var
needToFilter
=
selectedFilters
.
Length
>
0
&&
selectedFilters
.
Length
<
data
.
SelectedFilters
.
Length
;
// 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
;
if
(
session
.
TextView
.
Properties
.
TryGetProperty
(
CompletionSource
.
TargetTypeFilterExperimentEnabled
,
out
bool
isExperimentEnabled
)
&&
isExperimentEnabled
)
{
// Telemetry: Want to know % of sessions with the "Target type matches" filter where that filter is actually enabled
if
(
needToFilter
&&
!
session
.
Properties
.
ContainsProperty
(
_targetTypeCompletionFilterChosenMarker
)
&&
selectedFilters
.
Any
(
f
=>
f
.
DisplayText
==
FeaturesResources
.
Target_type_matches
))
selected
NonExpander
Filters
.
Any
(
f
=>
f
.
DisplayText
==
FeaturesResources
.
Target_type_matches
))
{
AsyncCompletionLogger
.
LogTargetTypeFilterChosenInSession
();
...
...
@@ -150,7 +151,15 @@ internal ItemManager(RecentItemsManager recentItemsManager)
{
cancellationToken
.
ThrowIfCancellationRequested
();
if
(
needToFilter
&&
ShouldBeFilteredOutOfCompletionList
(
item
,
selectedFilters
))
if
(
needToFilter
&&
ShouldBeFilteredOutOfCompletionList
(
item
,
selectedNonExpanderFilters
))
{
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
))
{
continue
;
}
...
...
@@ -446,15 +455,18 @@ private static bool IsAfterDot(ITextSnapshot snapshot, ITrackingSpan applicableT
// See which filters might be enabled based on the typed code
var
textFilteredFilters
=
filteredList
.
SelectMany
(
n
=>
n
.
VSCompletionItem
.
Filters
).
ToImmutableHashSet
();
// When no items are available for a given filter, it becomes unavailable
return
ImmutableArray
.
CreateRange
(
filters
.
Select
(
n
=>
n
.
WithAvailability
(
textFilteredFilters
.
Contains
(
n
.
Filter
))));
// When no items are available for a given filter, it becomes unavailable.
// Expanders always appear available as long as it's presented.
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
>
activeFilters
)
private
static
bool
ShouldBeFilteredOutOfCompletionList
(
VSCompletionItem
item
,
ImmutableArray
<
CompletionFilter
>
active
NonExpander
Filters
)
{
Debug
.
Assert
(!
activeNonExpanderFilters
.
Any
(
f
=>
f
is
CompletionExpander
));
foreach
(
var
itemFilter
in
item
.
Filters
)
{
if
(
activeFilters
.
Contains
(
itemFilter
))
if
(
active
NonExpander
Filters
.
Contains
(
itemFilter
))
{
return
false
;
}
...
...
@@ -463,6 +475,29 @@ private static bool ShouldBeFilteredOutOfCompletionList(VSCompletionItem item, I
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录