Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
a1208e7e
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,发现更多精彩内容 >>
提交
a1208e7e
编写于
3月 12, 2018
作者:
M
Martin Strecker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Change code fix registration to limit the number of menu entries to two.
上级
1e586c24
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
119 addition
and
25 deletion
+119
-25
src/Features/Core/Portable/AddParameter/AbstractAddParameterCodeFixProvider.cs
...table/AddParameter/AbstractAddParameterCodeFixProvider.cs
+83
-25
src/Features/Core/Portable/AddParameter/CodeFixData.cs
src/Features/Core/Portable/AddParameter/CodeFixData.cs
+36
-0
未找到文件。
src/Features/Core/Portable/AddParameter/AbstractAddParameterCodeFixProvider.cs
浏览文件 @
a1208e7e
...
...
@@ -194,41 +194,96 @@ private int NonParamsParameterCount(IMethodSymbol method)
SeparatedSyntaxList
<
TArgumentSyntax
>
arguments
,
ImmutableArray
<
ArgumentInsertPositionData
<
TArgumentSyntax
>>
methodsAndArgumentsToAdd
)
{
var
codeActions
=
CreateCodeActions
(
context
.
Document
,
arguments
,
methodsAndArgumentsToAdd
);
context
.
RegisterFixes
(
codeActions
,
context
.
Diagnostics
);
var
codeFixData
=
PrepareCreationOfCodeActions
(
context
.
Document
,
arguments
,
methodsAndArgumentsToAdd
);
var
fixes
=
codeFixData
.
Length
<=
2
?
NestByOverload
()
:
NestByCascading
();
context
.
RegisterFixes
(
fixes
,
context
.
Diagnostics
);
ImmutableArray
<
CodeAction
>
NestByOverload
()
{
var
builder
=
ImmutableArray
.
CreateBuilder
<
CodeAction
>(
codeFixData
.
Length
);
foreach
(
var
data
in
codeFixData
)
{
var
title
=
GetCodeFixTitle
(
FeaturesResources
.
Add_parameter_to_0
,
data
.
Method
,
includeParameters
:
true
);
CodeAction
codeAction
=
new
MyCodeAction
(
title
:
title
,
data
.
CreateChangedSolutionNonCascading
);
if
(
data
.
CreateChangedSolutionCascading
!=
null
)
{
var
titleForNesting
=
GetCodeFixTitle
(
FeaturesResources
.
Add_parameter_to_0
,
data
.
Method
,
includeParameters
:
true
);
var
titleCascading
=
GetCodeFixTitle
(
FeaturesResources
.
Add_parameter_to_0_including_overrides_implementations
,
data
.
Method
,
includeParameters
:
true
);
codeAction
=
new
CodeAction
.
CodeActionWithNestedActions
(
title
:
titleForNesting
,
ImmutableArray
.
Create
(
codeAction
,
new
MyCodeAction
(
title
:
titleCascading
,
data
.
CreateChangedSolutionCascading
)),
isInlinable
:
true
);
}
builder
.
Add
(
codeAction
);
}
return
builder
.
ToImmutable
();
}
ImmutableArray
<
CodeAction
>
NestByCascading
()
{
var
builder
=
ImmutableArray
.
CreateBuilder
<
CodeAction
>(
2
);
var
nonCascadingActions
=
ImmutableArray
.
CreateRange
<
CodeAction
>(
codeFixData
.
Select
(
data
=>
{
var
title
=
GetCodeFixTitle
(
FeaturesResources
.
Add_parameter_to_0
,
data
.
Method
,
true
);
return
new
MyCodeAction
(
title
:
title
,
data
.
CreateChangedSolutionNonCascading
);
}));
var
cascading
=
codeFixData
.
Where
(
data
=>
data
.
CreateChangedSolutionCascading
!=
null
);
var
cascadingActions
=
ImmutableArray
.
CreateRange
<
CodeAction
>(
cascading
.
Select
(
data
=>
{
var
title
=
GetCodeFixTitle
(
FeaturesResources
.
Add_parameter_to_0
,
data
.
Method
,
true
);
return
new
MyCodeAction
(
title
:
title
,
data
.
CreateChangedSolutionCascading
);
}));
var
aMethod
=
codeFixData
.
First
().
Method
;
var
nestedNonCascadingTitle
=
GetCodeFixTitle
(
FeaturesResources
.
Add_parameter_to_0
,
aMethod
,
false
);
builder
.
Add
(
new
CodeAction
.
CodeActionWithNestedActions
(
nestedNonCascadingTitle
,
nonCascadingActions
,
isInlinable
:
false
));
if
(
cascadingActions
.
Length
>
0
)
{
var
nestedCascadingTitle
=
GetCodeFixTitle
(
FeaturesResources
.
Add_parameter_to_0_including_overrides_implementations
,
aMethod
,
false
);
builder
.
Add
(
new
CodeAction
.
CodeActionWithNestedActions
(
nestedCascadingTitle
,
cascadingActions
,
isInlinable
:
false
));
}
return
builder
.
ToImmutable
();
}
}
private
ImmutableArray
<
Code
Action
>
Create
CodeActions
(
Document
document
,
SeparatedSyntaxList
<
TArgumentSyntax
>
arguments
,
ImmutableArray
<
ArgumentInsertPositionData
<
TArgumentSyntax
>>
methodsAndArgumentsToAdd
)
private
ImmutableArray
<
Code
FixData
>
PrepareCreationOf
CodeActions
(
Document
document
,
SeparatedSyntaxList
<
TArgumentSyntax
>
arguments
,
ImmutableArray
<
ArgumentInsertPositionData
<
TArgumentSyntax
>>
methodsAndArgumentsToAdd
)
{
var
builder
=
ImmutableArray
.
CreateBuilder
<
CodeFixData
>(
methodsAndArgumentsToAdd
.
Length
);
// Order by the furthest argument index to the nearest argument index. The ones with
// larger argument indexes mean that we matched more earlier arguments (and thus are
// likely to be the correct match).
var
builder
=
ImmutableArray
.
CreateBuilder
<
CodeAction
>(
methodsAndArgumentsToAdd
.
Length
);
foreach
(
var
argumentInsertPositionData
in
methodsAndArgumentsToAdd
.
OrderByDescending
(
t
=>
t
.
ArgumentInsertionIndex
))
{
var
methodToUpdate
=
argumentInsertPositionData
.
MethodToUpdate
;
var
argumentToInsert
=
argumentInsertPositionData
.
ArgumentToInsert
;
var
parameters
=
methodToUpdate
.
Parameters
.
Select
(
p
=>
p
.
ToDisplayString
(
SimpleFormat
));
var
title
=
GetCodeFixTitle
(
FeaturesResources
.
Add_parameter_to_0
,
methodToUpdate
,
parameters
);
var
hasCascadingDeclarations
=
HasCascadingDeclarations
(
methodToUpdate
);
CodeAction
codeAction
=
new
MyCodeAction
(
title
,
c
=>
FixAsync
(
document
,
methodToUpdate
,
argumentToInsert
,
arguments
,
fixAllReferences
:
false
,
c
));
if
(
hasCascadingDeclarations
)
{
// Offer another alternative code action. Wrap both options so the IDE can collapse them.
var
titleForCascadingFix
=
GetCodeFixTitle
(
FeaturesResources
.
Add_parameter_to_0_including_overrides_implementations
,
methodToUpdate
,
parameters
);
codeAction
=
new
CodeAction
.
CodeActionWithNestedActions
(
title
:
title
,
isInlinable
:
true
,
nestedActions
:
ImmutableArray
.
Create
<
CodeAction
>(
codeAction
,
new
MyCodeAction
(
titleForCascadingFix
,
c
=>
FixAsync
(
document
,
methodToUpdate
,
argumentToInsert
,
arguments
,
fixAllReferences
:
true
,
c
))));
}
var
cascadingFix
=
HasCascadingDeclarations
(
methodToUpdate
)
?
new
Func
<
CancellationToken
,
Task
<
Solution
>>(
c
=>
FixAsync
(
document
,
methodToUpdate
,
argumentToInsert
,
arguments
,
fixAllReferences
:
true
,
c
))
:
null
;
var
codeFixData
=
new
CodeFixData
(
methodToUpdate
,
c
=>
FixAsync
(
document
,
methodToUpdate
,
argumentToInsert
,
arguments
,
fixAllReferences
:
false
,
c
),
cascadingFix
);
builder
.
Add
(
code
Action
);
builder
.
Add
(
code
FixData
);
}
return
builder
.
ToImmutable
();
...
...
@@ -280,7 +335,7 @@ private bool HasCascadingDeclarations(IMethodSymbol method)
return
false
;
}
private
static
string
GetCodeFixTitle
(
string
resourceString
,
IMethodSymbol
methodToUpdate
,
IEnumerable
<
string
>
p
arameters
)
private
static
string
GetCodeFixTitle
(
string
resourceString
,
IMethodSymbol
methodToUpdate
,
bool
includeP
arameters
)
{
var
methodDisplay
=
methodToUpdate
.
ToDisplayString
(
new
SymbolDisplayFormat
(
typeQualificationStyle
:
SymbolDisplayTypeQualificationStyle
.
NameAndContainingTypes
,
...
...
@@ -290,7 +345,10 @@ private static string GetCodeFixTitle(string resourceString, IMethodSymbol metho
?
SymbolDisplayMemberOptions
.
None
:
SymbolDisplayMemberOptions
.
IncludeContainingType
));
var
signature
=
$"
{
methodDisplay
}
(
{
string
.
Join
(
", "
,
parameters
)}
)"
;
var
parameters
=
methodToUpdate
.
Parameters
.
Select
(
p
=>
p
.
ToDisplayString
(
SimpleFormat
));
var
signature
=
includeParameters
?
$"
{
methodDisplay
}
(
{
string
.
Join
(
", "
,
parameters
)}
)"
:
methodDisplay
;
var
title
=
string
.
Format
(
resourceString
,
signature
);
return
title
;
}
...
...
src/Features/Core/Portable/AddParameter/CodeFixData.cs
0 → 100644
浏览文件 @
a1208e7e
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
using
System.Threading
;
using
System.Threading.Tasks
;
namespace
Microsoft.CodeAnalysis.AddParameter
{
internal
struct
CodeFixData
{
public
CodeFixData
(
IMethodSymbol
method
,
Func
<
CancellationToken
,
Task
<
Solution
>>
createChangedSolutionNonCascading
,
Func
<
CancellationToken
,
Task
<
Solution
>>
createChangedSolutionCascading
)
{
Method
=
method
??
throw
new
ArgumentNullException
(
nameof
(
method
));
CreateChangedSolutionNonCascading
=
createChangedSolutionNonCascading
??
throw
new
ArgumentNullException
(
nameof
(
createChangedSolutionNonCascading
));
CreateChangedSolutionCascading
=
createChangedSolutionCascading
;
}
/// <summary>
/// The overload to fix.
/// </summary>
public
IMethodSymbol
Method
{
get
;
}
/// <summary>
/// A mandatory fix for the overload without cascading.
/// </summary>
public
Func
<
CancellationToken
,
Task
<
Solution
>>
CreateChangedSolutionNonCascading
{
get
;
}
/// <summary>
/// An optional fix for the overload with cascading.
/// </summary>
public
Func
<
CancellationToken
,
Task
<
Solution
>>
CreateChangedSolutionCascading
{
get
;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录