Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
ef0b2acc
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,发现更多精彩内容 >>
提交
ef0b2acc
编写于
4月 29, 2020
作者:
C
Cyrus Najmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make pattern clearer
上级
107e78e3
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
59 addition
and
38 deletion
+59
-38
src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentTypeFinder.cs
...ortable/FindSymbols/FindReferences/DependentTypeFinder.cs
+59
-38
未找到文件。
src/Workspaces/Core/Portable/FindSymbols/FindReferences/DependentTypeFinder.cs
浏览文件 @
ef0b2acc
...
...
@@ -255,9 +255,9 @@ internal static partial class DependentTypeFinder
var
foundTypes
=
CreateSymbolAndProjectIdSet
();
try
{
// First see what derived metadata types we might find in this project. This is only necessary if we
started
//
with a metadata type (i.e. a source type could not have a descendant type found in metadata, but a
// metadata type could have descendant types in source and metadata).
// First see what derived metadata types we might find in this project. This is only necessary if we
//
started with a metadata type (i.e. a source type could not have a descendant type found in metadata,
//
but a
metadata type could have descendant types in source and metadata).
if
(
searchInMetadata
)
{
await
AddMetadataTypesInProjectAsync
(
...
...
@@ -269,49 +269,43 @@ internal static partial class DependentTypeFinder
foundTypes
,
cancellationToken
).
ConfigureAwait
(
false
);
foreach
(
var
foundType
in
foundTypes
)
{
cancellationToken
.
ThrowIfCancellationRequested
();
Debug
.
Assert
(
foundType
.
Locations
.
Any
(
s_isInMetadata
));
// Add all the matches we found to the result set.
AssertContents
(
foundTypes
,
assert
:
s_isInMetadata
,
"Found type was not from metadata"
);
AddRange
(
foundTypes
,
result
);
// This was a good match, add to the final result list.
result
.
Add
(
foundType
);
// If we're doing a transitive search, add these found types to the 'current' sets we're
// searching for more results for. These will then be used when searching for more types in the
// next project (which our caller controls).
if
(
transitive
&&
shouldContinueSearching
(
foundType
))
{
currentMetadataTypes
.
Add
(
foundType
);
currentSourceAndMetadataTypes
.
Add
(
foundType
);
}
// Now, if we're doing a transitive search, add these found types to the 'current' sets we're
// searching for more results for. These will then be used when searching for more types in the next
// project (which our caller controls).
if
(
transitive
)
{
AddRange
(
foundTypes
,
currentMetadataTypes
,
shouldContinueSearching
);
AddRange
(
foundTypes
,
currentSourceAndMetadataTypes
,
shouldContinueSearching
);
}
}
// Now search the project and see what source types we can find.
foundTypes
.
Clear
();
await
AddSourceTypesInProjectAsync
(
currentSourceAndMetadataTypes
,
project
,
typeMatches
,
shouldContinueSearching
,
transitive
,
foundTypes
,
cancellationToken
).
ConfigureAwait
(
false
);
foreach
(
var
foundType
in
foundTypes
)
{
cancellationToken
.
ThrowIfCancellationRequested
();
// Now search the project and see what source types we can find.
foundTypes
.
Clear
();
Debug
.
Assert
(
foundType
.
Locations
.
All
(
s_isInSource
));
await
AddSourceTypesInProjectAsync
(
currentSourceAndMetadataTypes
,
project
,
typeMatches
,
shouldContinueSearching
,
transitive
,
foundTypes
,
cancellationToken
).
ConfigureAwait
(
false
);
// Add to the result list.
result
.
Add
(
foundType
);
// Add all the matches we found to the result set.
AssertContents
(
foundTypes
,
assert
:
s_isInSource
,
"Found type was not from source"
)
AddRange
(
foundTypes
,
result
);
if
(
transitive
&&
shouldContinueSearching
(
foundType
))
currentSourceAndMetadataTypes
.
Add
(
foundType
);
// Now, if we're doing a transitive search, add these types to the currentSourceAndMetadataTypes
// set. These will then be used when searching for more types in the next project (which our caller
// controls). We don't have to add this to currentMetadataTypes since these will all be
// source types.
if
(
transitive
)
AddRange
(
foundTypes
,
currentSourceAndMetadataTypes
,
shouldContinueSearching
);
}
}
finally
...
...
@@ -320,6 +314,33 @@ internal static partial class DependentTypeFinder
}
}
[
Conditional
(
"DEBUG"
)]
private
static
void
AssertContents
(
SymbolSet
foundTypes
,
Func
<
Location
,
bool
>
assert
,
string
message
)
{
foreach
(
var
type
in
foundTypes
)
Debug
.
Assert
(
type
.
Locations
.
All
(
assert
),
message
);
}
private
static
void
AddRange
(
SymbolSet
foundTypes
,
SymbolSet
result
)
{
// Directly enumerate to avoid IEnumerator allocations.
foreach
(
var
type
in
foundTypes
)
result
.
Add
(
type
);
}
private
static
void
AddRange
(
SymbolSet
foundTypes
,
SymbolSet
currentTypes
,
Func
<
INamedTypeSymbol
,
bool
>
shouldContinueSearching
)
{
// Directly enumerate to avoid IEnumerator allocations.
foreach
(
var
type
in
foundTypes
)
{
if
(
shouldContinueSearching
(
type
))
currentTypes
.
Add
(
type
);
}
}
private
static
async
Task
<
ISet
<
ProjectId
>>
GetProjectsThatCouldReferenceTypeAsync
(
INamedTypeSymbol
type
,
Solution
solution
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录