Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
618d74d5
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,发现更多精彩内容 >>
提交
618d74d5
编写于
3月 27, 2020
作者:
S
Sam Harwell
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Simplify extension providers
上级
dd4dbcdb
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
119 addition
and
114 deletion
+119
-114
src/EditorFeatures/Core/Implementation/CodeFixes/CodeFixService.ProjectCodeFixProvider.cs
...tation/CodeFixes/CodeFixService.ProjectCodeFixProvider.cs
+14
-58
src/EditorFeatures/Core/Implementation/CodeFixes/CodeFixService.cs
...rFeatures/Core/Implementation/CodeFixes/CodeFixService.cs
+1
-1
src/Features/Core/Portable/CodeRefactorings/CodeRefactoringService.cs
.../Core/Portable/CodeRefactorings/CodeRefactoringService.cs
+15
-55
src/Features/Core/Portable/Common/AbstractProjectExtensionProvider`2.cs
...ore/Portable/Common/AbstractProjectExtensionProvider`2.cs
+89
-0
未找到文件。
src/EditorFeatures/Core/Implementation/CodeFixes/CodeFixService.ProjectCodeFixProvider.cs
浏览文件 @
618d74d5
...
...
@@ -3,84 +3,40 @@
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections.Generic
;
using
System.Collections.Immutable
;
using
System.Linq
;
using
System.Reflection
;
using
Microsoft.CodeAnalysis.Diagnostics
;
using
Microsoft.CodeAnalysis.PooledObjects
;
namespace
Microsoft.CodeAnalysis.CodeFixes
{
using
TypeInfo
=
System
.
Reflection
.
TypeInfo
;
internal
partial
class
CodeFixService
{
private
class
ProjectCodeFixProvider
:
AbstractProjectExtensionProvider
<
CodeFixProvider
,
ExportCodeFixProviderAttribute
>
{
private
readonly
AnalyzerReference
_reference
;
private
ImmutableDictionary
<
string
,
ImmutableArray
<
CodeFixProvider
>>
_fixersPerLanguage
;
public
ProjectCodeFixProvider
(
AnalyzerReference
reference
)
:
base
(
reference
)
{
_reference
=
reference
;
_fixersPerLanguage
=
ImmutableDictionary
<
string
,
ImmutableArray
<
CodeFixProvider
>>.
Empty
;
}
public
ImmutableArray
<
CodeFixProvider
>
GetFixers
(
string
language
)
=>
ImmutableInterlocked
.
GetOrAdd
(
ref
_fixersPerLanguage
,
language
,
CreateFixers
);
private
ImmutableArray
<
CodeFixProvider
>
CreateFixers
(
string
language
)
{
// check whether the analyzer reference knows how to return fixers directly.
if
(
_reference
is
ICodeFixProviderFactory
codeFixProviderFactory
)
{
return
codeFixProviderFactory
.
GetFixers
();
}
// otherwise, see whether we can pick it up from reference itself
if
(!(
_reference
is
AnalyzerFileReference
analyzerFileReference
))
protected
override
bool
SupportsLanguage
(
ExportCodeFixProviderAttribute
exportAttribute
,
string
language
)
{
return
ImmutableArray
<
CodeFixProvider
>.
Empty
;
return
exportAttribute
.
Languages
==
null
||
exportAttribute
.
Languages
.
Length
==
0
||
exportAttribute
.
Languages
.
Contains
(
language
);
}
using
var
builderDisposer
=
ArrayBuilder
<
CodeFixProvider
>.
GetInstance
(
out
var
builder
);
try
{
var
analyzerAssembly
=
analyzerFileReference
.
GetAssembly
();
var
typeInfos
=
analyzerAssembly
.
DefinedTypes
;
foreach
(
var
typeInfo
in
typeInfos
)
{
if
(
typeInfo
.
IsSubclassOf
(
typeof
(
CodeFixProvider
)))
protected
override
bool
TryGetExtensionsFromReference
(
AnalyzerReference
reference
,
out
ImmutableArray
<
CodeFixProvider
>
extensions
)
{
try
{
var
attribute
=
typeInfo
.
GetCustomAttribute
<
ExportCodeFixProviderAttribute
>();
if
(
attribute
!=
null
)
{
if
(
attribute
.
Languages
==
null
||
attribute
.
Languages
.
Length
==
0
||
attribute
.
Languages
.
Contains
(
language
))
{
builder
.
Add
((
CodeFixProvider
)
Activator
.
CreateInstance
(
typeInfo
.
AsType
()));
}
}
}
catch
{
}
}
}
}
catch
// check whether the analyzer reference knows how to return fixers directly.
if
(
reference
is
ICodeFixProviderFactory
codeFixProviderFactory
)
{
// REVIEW: is the below message right?
// NOTE: We could report "unable to load analyzer" exception here but it should have been already reported by DiagnosticService.
extensions
=
codeFixProviderFactory
.
GetFixers
();
return
true
;
}
return
builder
.
ToImmutable
();
extensions
=
default
;
return
false
;
}
}
}
...
...
src/EditorFeatures/Core/Implementation/CodeFixes/CodeFixService.cs
浏览文件 @
618d74d5
...
...
@@ -807,7 +807,7 @@ static ImmutableArray<IConfigurationFixProvider> GetConfigurationFixProviders(Li
foreach
(
var
reference
in
project
.
AnalyzerReferences
)
{
var
projectCodeFixerProvider
=
_analyzerReferenceToFixersMap
.
GetValue
(
reference
,
_createProjectCodeFixProvider
);
foreach
(
var
fixer
in
projectCodeFixerProvider
.
Get
Fixer
s
(
project
.
Language
))
foreach
(
var
fixer
in
projectCodeFixerProvider
.
Get
Extension
s
(
project
.
Language
))
{
var
fixableIds
=
this
.
GetFixableDiagnosticIds
(
fixer
,
extensionManager
);
foreach
(
var
id
in
fixableIds
)
...
...
src/Features/Core/Portable/CodeRefactorings/CodeRefactoringService.cs
浏览文件 @
618d74d5
...
...
@@ -9,7 +9,6 @@
using
System.Collections.Immutable
;
using
System.Composition
;
using
System.Linq
;
using
System.Reflection
;
using
System.Runtime.CompilerServices
;
using
System.Threading
;
using
System.Threading.Tasks
;
...
...
@@ -229,7 +228,7 @@ ImmutableArray<CodeRefactoringProvider> ComputeProjectRefactorings(Project proje
foreach
(
var
reference
in
project
.
AnalyzerReferences
)
{
var
projectCodeRefactoringProvider
=
_analyzerReferenceToRefactoringsMap
.
GetValue
(
reference
,
_createProjectCodeRefactoringsProvider
);
foreach
(
var
refactoring
in
projectCodeRefactoringProvider
.
Get
Refactoring
s
(
project
.
Language
))
foreach
(
var
refactoring
in
projectCodeRefactoringProvider
.
Get
Extension
s
(
project
.
Language
))
{
builder
.
Add
(
refactoring
);
}
...
...
@@ -240,70 +239,31 @@ ImmutableArray<CodeRefactoringProvider> ComputeProjectRefactorings(Project proje
}
private
class
ProjectCodeRefactoringProvider
:
AbstractProjectExtensionProvider
<
CodeRefactoringProvider
,
ExportCodeRefactoringProviderAttribute
>
{
private
readonly
AnalyzerReference
_reference
;
private
ImmutableDictionary
<
string
,
ImmutableArray
<
CodeRefactoringProvider
>>
_refactoringsPerLanguage
;
public
ProjectCodeRefactoringProvider
(
AnalyzerReference
reference
)
:
base
(
reference
)
{
_reference
=
reference
;
_refactoringsPerLanguage
=
ImmutableDictionary
<
string
,
ImmutableArray
<
CodeRefactoringProvider
>>.
Empty
;
}
public
ImmutableArray
<
CodeRefactoringProvider
>
GetRefactorings
(
string
language
)
=>
ImmutableInterlocked
.
GetOrAdd
(
ref
_refactoringsPerLanguage
,
language
,
(
language
,
provider
)
=>
provider
.
CreateRefactorings
(
language
),
this
);
private
ImmutableArray
<
CodeRefactoringProvider
>
CreateRefactorings
(
string
language
)
{
// check whether the analyzer reference knows how to return fixers directly.
if
(
_reference
is
ICodeRefactoringProviderFactory
codeRefactoringProviderFactory
)
{
return
codeRefactoringProviderFactory
.
GetRefactorings
();
}
// otherwise, see whether we can pick it up from reference itself
if
(!(
_reference
is
AnalyzerFileReference
analyzerFileReference
))
protected
override
bool
SupportsLanguage
(
ExportCodeRefactoringProviderAttribute
exportAttribute
,
string
language
)
{
return
ImmutableArray
<
CodeRefactoringProvider
>.
Empty
;
return
exportAttribute
.
Languages
==
null
||
exportAttribute
.
Languages
.
Length
==
0
||
exportAttribute
.
Languages
.
Contains
(
language
);
}
var
builder
=
ArrayBuilder
<
CodeRefactoringProvider
>.
GetInstance
();
try
{
var
analyzerAssembly
=
analyzerFileReference
.
GetAssembly
();
var
typeInfos
=
analyzerAssembly
.
DefinedTypes
;
foreach
(
var
typeInfo
in
typeInfos
)
{
if
(
typeInfo
.
IsSubclassOf
(
typeof
(
CodeRefactoringProvider
)))
{
try
{
var
attribute
=
typeInfo
.
GetCustomAttribute
<
ExportCodeRefactoringProviderAttribute
>();
if
(
attribute
!=
null
)
{
if
(
attribute
.
Languages
==
null
||
attribute
.
Languages
.
Length
==
0
||
attribute
.
Languages
.
Contains
(
language
))
{
builder
.
Add
((
CodeRefactoringProvider
)
Activator
.
CreateInstance
(
typeInfo
.
AsType
())!);
}
}
}
catch
protected
override
bool
TryGetExtensionsFromReference
(
AnalyzerReference
reference
,
out
ImmutableArray
<
CodeRefactoringProvider
>
extensions
)
{
}
}
}
}
catch
// check whether the analyzer reference knows how to return fixers directly.
if
(
reference
is
ICodeRefactoringProviderFactory
codeRefactoringProviderFactory
)
{
// REVIEW: is the below message right?
// NOTE: We could report "unable to load analyzer" exception here but it should have been already reported by DiagnosticService.
extensions
=
codeRefactoringProviderFactory
.
GetRefactorings
();
return
true
;
}
return
builder
.
ToImmutableAndFree
();
extensions
=
default
;
return
false
;
}
}
}
...
...
src/Features/Core/Portable/Common/AbstractProjectExtensionProvider`2.cs
0 → 100644
浏览文件 @
618d74d5
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections.Immutable
;
using
System.Reflection
;
using
Microsoft.CodeAnalysis.Diagnostics
;
using
Microsoft.CodeAnalysis.PooledObjects
;
namespace
Microsoft.CodeAnalysis
{
internal
abstract
class
AbstractProjectExtensionProvider
<
TExtension
,
TExportAttribute
>
where
TExportAttribute
:
Attribute
{
private
readonly
AnalyzerReference
_reference
;
private
ImmutableDictionary
<
string
,
ImmutableArray
<
TExtension
>>
_extensionsPerLanguage
;
public
AbstractProjectExtensionProvider
(
AnalyzerReference
reference
)
{
_reference
=
reference
;
_extensionsPerLanguage
=
ImmutableDictionary
<
string
,
ImmutableArray
<
TExtension
>>.
Empty
;
}
public
ImmutableArray
<
TExtension
>
GetExtensions
(
string
language
)
{
return
ImmutableInterlocked
.
GetOrAdd
(
ref
_extensionsPerLanguage
,
language
,
(
language
,
provider
)
=>
provider
.
CreateExtensions
(
language
),
this
);
}
protected
virtual
bool
SupportsLanguage
(
TExportAttribute
exportAttribute
,
string
language
)
{
return
true
;
}
protected
virtual
bool
TryGetExtensionsFromReference
(
AnalyzerReference
reference
,
out
ImmutableArray
<
TExtension
>
extensions
)
{
extensions
=
default
;
return
false
;
}
private
ImmutableArray
<
TExtension
>
CreateExtensions
(
string
language
)
{
// check whether the analyzer reference knows how to return fixers directly.
if
(
TryGetExtensionsFromReference
(
_reference
,
out
var
extensions
))
{
return
extensions
;
}
// otherwise, see whether we can pick it up from reference itself
if
(!(
_reference
is
AnalyzerFileReference
analyzerFileReference
))
{
return
ImmutableArray
<
TExtension
>.
Empty
;
}
using
var
_
=
ArrayBuilder
<
TExtension
>.
GetInstance
(
out
var
builder
);
try
{
var
analyzerAssembly
=
analyzerFileReference
.
GetAssembly
();
var
typeInfos
=
analyzerAssembly
.
DefinedTypes
;
foreach
(
var
typeInfo
in
typeInfos
)
{
if
(
typeInfo
.
IsSubclassOf
(
typeof
(
TExtension
)))
{
try
{
var
attribute
=
typeInfo
.
GetCustomAttribute
<
TExportAttribute
>();
if
(
attribute
is
object
&&
SupportsLanguage
(
attribute
,
language
))
{
builder
.
Add
((
TExtension
)
Activator
.
CreateInstance
(
typeInfo
.
AsType
()));
}
}
catch
{
}
}
}
}
catch
{
// REVIEW: is the below message right?
// NOTE: We could report "unable to load analyzer" exception here but it should have been already reported by DiagnosticService.
}
return
builder
.
ToImmutable
();
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录