Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
33be43fa
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,发现更多精彩内容 >>
提交
33be43fa
编写于
5月 15, 2016
作者:
C
CyrusNajmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make loop O(n)
上级
d377f78b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
25 addition
and
39 deletion
+25
-39
src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentTypeFinder.cs
...ortable/FindSymbols/FindReferences/DependentTypeFinder.cs
+25
-39
未找到文件。
src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentTypeFinder.cs
浏览文件 @
33be43fa
...
@@ -351,47 +351,33 @@ internal static class DependentTypeFinder
...
@@ -351,47 +351,33 @@ internal static class DependentTypeFinder
IImmutableSet
<
Project
>
projects
,
IImmutableSet
<
Project
>
projects
,
IEnumerable
<
ProjectId
>
projectsThatCouldReferenceType
)
IEnumerable
<
ProjectId
>
projectsThatCouldReferenceType
)
{
{
var
projectIds
=
projects
.
Select
(
p
=>
p
.
Id
).
ToSet
();
// We need to search all projects that could reference the type *and* which are
// referenced by some project in the project set.
var
dependencyGraph
=
solution
.
GetProjectDependencyGraph
();
var
dependencyGraph
=
solution
.
GetProjectDependencyGraph
();
foreach
(
var
projectThatCouldReferenceType
in
projectsThatCouldReferenceType
)
{
if
(
projectIds
.
Contains
(
projectThatCouldReferenceType
))
{
// We were explicitly asked to search this project, and it's a project that
// could be referencing the type we care about. Definitely search this one.
yield
return
solution
.
GetProject
(
projectThatCouldReferenceType
);
}
else
if
(
AnyProjectDependsOn
(
projects
,
dependencyGraph
,
projectThatCouldReferenceType
))
{
// While we were not explicitly asked to search 'projectThatCouldReferenceType',
// we do have some project we care about that depends on that project. Because of
// this we need to search 'projectThatCouldReferenceType' in case it introduces
// intermediate types that affect the projects we care about.
yield
return
solution
.
GetProject
(
projectThatCouldReferenceType
);
}
}
// No point searching a project if it wasn't a project that could have referenced that
// type in the first place.
}
private
static
bool
AnyProjectDependsOn
(
// Take the projects that were passed in, and find all the projects that
IImmutableSet
<
Project
>
projects
,
ProjectDependencyGraph
dependencyGraph
,
// they depend on (including themselves). i.e. if we have a solution that
ProjectId
projectThatCouldReferenceType
)
// looks like:
{
// A <- B <- C <- D
foreach
(
var
project
in
projects
)
// /
{
// └
var
projectsThisProjectDependsOn
=
dependencyGraph
.
GetProjectsThatThisProjectTransitivelyDependsOn
(
project
.
Id
);
// E
if
(
projectsThisProjectDependsOn
.
Contains
(
projectThatCouldReferenceType
))
// and we're passed in 'B, C, E' as hte project to search, then this set
{
// will be A, B, C, E.
return
true
;
var
allProjectsThatTheseProjectsDependOn
=
projects
}
.
SelectMany
(
p
=>
dependencyGraph
.
GetProjectsThatThisProjectTransitivelyDependsOn
(
p
.
Id
))
}
.
Concat
(
projects
.
Select
(
p
=>
p
.
Id
)).
ToSet
();
return
false
;
// We then intersect this set with the actual set of projects that could reference
// the type. Say this list is B, C, D. The intersection of this list and the above
// one will then be 'B' and 'C'.
//
// In other words, there is no point searching A and E (because they can't even
// reference the type). And there's no point searching 'D' because it can't contribute
// any information that would affect the result in the projects we are asked to search
// within.
return
projectsThatCouldReferenceType
.
Intersect
(
allProjectsThatTheseProjectsDependOn
)
.
Select
(
solution
.
GetProject
)
.
ToList
();
}
}
private
static
async
Task
<
IEnumerable
<
INamedTypeSymbol
>>
FindMetadataTypesInProjectAsync
(
private
static
async
Task
<
IEnumerable
<
INamedTypeSymbol
>>
FindMetadataTypesInProjectAsync
(
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录