Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
fac8eb6d
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,发现更多精彩内容 >>
提交
fac8eb6d
编写于
4月 23, 2017
作者:
C
CyrusNajmabadi
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'upstream/master' into findRefsOOPWork
上级
7fc77566
40199132
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
25 addition
and
24 deletion
+25
-24
src/EditorFeatures/Core/FindUsages/AbstractFindUsagesService.DefinitionTrackingContext.cs
...es/AbstractFindUsagesService.DefinitionTrackingContext.cs
+1
-1
src/EditorFeatures/Core/FindUsages/AbstractFindUsagesService.cs
...itorFeatures/Core/FindUsages/AbstractFindUsagesService.cs
+24
-23
未找到文件。
src/EditorFeatures/Core/FindUsages/AbstractFindUsagesService.DefinitionTrackingContext.cs
浏览文件 @
fac8eb6d
...
...
@@ -14,7 +14,7 @@ internal abstract partial class AbstractFindUsagesService
/// Forwards <see cref="IFindUsagesContext"/> notifications to an underlying <see cref="IFindUsagesContext"/>
/// while also keeping track of the <see cref="DefinitionItem"/> definitions reported.
///
/// These can then be used by <see cref="
CallThirdPartyExtensionsAsync
"/> to report the
/// These can then be used by <see cref="
GetThirdPartyDefinitions
"/> to report the
/// definitions found to third parties in case they want to add any additional definitions
/// to the results we present.
/// </summary>
...
...
src/EditorFeatures/Core/FindUsages/AbstractFindUsagesService.cs
浏览文件 @
fac8eb6d
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using
System.Collections.Immutable
;
using
System.Linq
;
using
System.Threading
;
using
System.Threading.Tasks
;
using
Microsoft.CodeAnalysis.FindSymbols
;
using
Microsoft.CodeAnalysis.FindUsages
;
using
Microsoft.CodeAnalysis.LanguageServices
;
using
Microsoft.CodeAnalysis.Shared.Extensions
;
using
Microsoft.CodeAnalysis.Text
;
using
Roslyn.Utilities
;
namespace
Microsoft.CodeAnalysis.Editor.FindUsages
{
...
...
@@ -50,18 +51,27 @@ internal abstract partial class AbstractFindUsagesService : IFindUsagesService
{
var
definitionTrackingContext
=
new
DefinitionTrackingContext
(
context
);
// N
OTE: All ConFigureAwaits in this method need to pass 'true' so that
//
we return to the caller's context. that's so the call to
//
CallThirdPartyExtensionsAsync will happen on the UI thread. We need
//
this to maintain the threading guarantee we had around that method
//
from pre-Roslyn days
.
// N
eed ConfigureAwait(true) here so we get back to the UI thread before calling
//
GetThirdPartyDefinitions. We need to call that on the UI thread to match behavior
//
of how the language service always worked in the past.
//
//
Any async calls before GetThirdPartyDefinitions must be ConfigureAwait(true)
.
await
FindLiteralOrSymbolReferencesAsync
(
document
,
position
,
definitionTrackingContext
).
ConfigureAwait
(
true
);
// After the FAR engine is done call into any third party extensions to see
// if they want to add results.
await
CallThirdPartyExtensionsAsync
(
document
.
Project
.
Solution
,
definitionTrackingContext
,
context
).
ConfigureAwait
(
true
);
var
thirdPartyDefinitions
=
GetThirdPartyDefinitions
(
document
.
Project
.
Solution
,
definitionTrackingContext
.
GetDefinitions
(),
context
.
CancellationToken
);
// From this point on we can do ConfigureAwait(false) as we're not calling back
// into third parties anymore.
foreach
(
var
definition
in
thirdPartyDefinitions
)
{
// Don't need ConfigureAwait(true) here
await
context
.
OnDefinitionFoundAsync
(
definition
).
ConfigureAwait
(
false
);
}
}
private
async
Task
FindLiteralOrSymbolReferencesAsync
(
...
...
@@ -81,24 +91,15 @@ internal abstract partial class AbstractFindUsagesService : IFindUsagesService
document
,
position
,
context
).
ConfigureAwait
(
false
);
}
private
async
Task
CallThirdPartyExtensionsAsync
(
private
ImmutableArray
<
DefinitionItem
>
GetThirdPartyDefinitions
(
Solution
solution
,
DefinitionTrackingContext
definitionTrackingContext
,
IFindUsagesContext
underlyingContext
)
ImmutableArray
<
DefinitionItem
>
definitions
,
CancellationToken
cancellationToken
)
{
var
cancellationToken
=
definitionTrackingContext
.
CancellationToken
;
var
factory
=
solution
.
Workspace
.
Services
.
GetService
<
IDefinitionsAndReferencesFactory
>();
foreach
(
var
definition
in
definitionTrackingContext
.
GetDefinitions
())
{
var
item
=
factory
.
GetThirdPartyDefinitionItem
(
solution
,
definition
,
cancellationToken
);
if
(
item
!=
null
)
{
// ConfigureAwait(true) because we want to come back on the
// same thread after calling into extensions.
await
underlyingContext
.
OnDefinitionFoundAsync
(
item
).
ConfigureAwait
(
true
);
}
}
return
definitions
.
Select
(
d
=>
factory
.
GetThirdPartyDefinitionItem
(
solution
,
d
,
cancellationToken
))
.
WhereNotNull
()
.
ToImmutableArray
();
}
private
async
Task
FindSymbolReferencesAsync
(
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录