Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
a91c6ee9
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,发现更多精彩内容 >>
提交
a91c6ee9
编写于
8月 14, 2019
作者:
S
Shlomo Zach Cahlon
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Final commit
上级
9edbeefa
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
86 addition
and
97 deletion
+86
-97
src/EditorFeatures/CSharpTest/InitializeParameter/AddParameterCheckTests.cs
.../CSharpTest/InitializeParameter/AddParameterCheckTests.cs
+16
-0
src/Features/CSharp/Portable/InitializeParameter/CSharpAddParameterCheckCodeRefactoringProvider.cs
...rameter/CSharpAddParameterCheckCodeRefactoringProvider.cs
+0
-5
src/Features/CSharp/Portable/InitializeParameter/CSharpInitializeMemberFromParameterCodeRefactoringProvider.cs
...rpInitializeMemberFromParameterCodeRefactoringProvider.cs
+0
-5
src/Features/CSharp/Portable/InitializeParameter/InitializeParameterHelpers.cs
...ortable/InitializeParameter/InitializeParameterHelpers.cs
+0
-10
src/Features/Core/Portable/InitializeParameter/AbstractInitializeParameterCodeRefactoringProvider.cs
...ter/AbstractInitializeParameterCodeRefactoringProvider.cs
+70
-61
src/Features/VisualBasic/Portable/InitializeParameter/InitializeParameterHelpers.vb
...ortable/InitializeParameter/InitializeParameterHelpers.vb
+0
-10
src/Features/VisualBasic/Portable/InitializeParameter/VisualBasicAddParameterCheckCodeRefactoringProvider.vb
...er/VisualBasicAddParameterCheckCodeRefactoringProvider.vb
+0
-3
src/Features/VisualBasic/Portable/InitializeParameter/VisualBasicInitializeMemberFromParameterCodeRefactoringProvider.vb
...icInitializeMemberFromParameterCodeRefactoringProvider.vb
+0
-3
未找到文件。
src/EditorFeatures/CSharpTest/InitializeParameter/AddParameterCheckTests.cs
浏览文件 @
a91c6ee9
...
...
@@ -1359,6 +1359,22 @@ class C
}
}"
);
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsInitializeParameter
)]
public
async
Task
TestNotOnIndexerParameters
()
{
await
TestMissingAsync
(
@"
class C
{
int this[[|object a|], object b, object c]
{
get
{
return 0;
}
}
}"
);
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsInitializeParameter
)]
public
async
Task
TestSpecialStringCheck1
()
...
...
src/Features/CSharp/Portable/InitializeParameter/CSharpAddParameterCheckCodeRefactoringProvider.cs
浏览文件 @
a91c6ee9
...
...
@@ -54,10 +54,5 @@ protected override bool CanOffer(SyntaxNode body)
return
true
;
}
protected
override
ImmutableArray
<
SyntaxNode
>
GetParameters
(
SyntaxNode
node
,
SyntaxGenerator
generator
)
{
return
InitializeParameterHelpers
.
GetParameters
(
node
,
generator
);
}
}
}
src/Features/CSharp/Portable/InitializeParameter/CSharpInitializeMemberFromParameterCodeRefactoringProvider.cs
浏览文件 @
a91c6ee9
...
...
@@ -49,10 +49,5 @@ protected override Accessibility DetermineDefaultPropertyAccessibility()
protected
override
SyntaxNode
GetBody
(
SyntaxNode
functionDeclaration
)
=>
InitializeParameterHelpers
.
GetBody
(
functionDeclaration
);
protected
override
ImmutableArray
<
SyntaxNode
>
GetParameters
(
SyntaxNode
node
,
SyntaxGenerator
generator
)
{
return
InitializeParameterHelpers
.
GetParameters
(
node
,
generator
);
}
}
}
src/Features/CSharp/Portable/InitializeParameter/InitializeParameterHelpers.cs
浏览文件 @
a91c6ee9
...
...
@@ -33,16 +33,6 @@ public static SyntaxNode GetBody(SyntaxNode functionDeclaration)
}
}
public
static
ImmutableArray
<
SyntaxNode
>
GetParameters
(
SyntaxNode
node
,
SyntaxGenerator
generator
)
{
if
(
node
is
SimpleLambdaExpressionSyntax
simpleLambda
)
{
return
ImmutableArray
.
Create
(
simpleLambda
.
Parameter
as
SyntaxNode
);
}
return
generator
.
GetParameters
(
node
).
ToImmutableArray
();
}
private
static
SyntaxToken
?
TryGetSemicolonToken
(
SyntaxNode
functionDeclaration
)
{
switch
(
functionDeclaration
)
...
...
src/Features/Core/Portable/InitializeParameter/AbstractInitializeParameterCodeRefactoringProvider.cs
浏览文件 @
a91c6ee9
...
...
@@ -33,8 +33,6 @@ internal abstract partial class AbstractInitializeParameterCodeRefactoringProvid
SyntaxEditor
editor
,
SyntaxNode
functionDeclaration
,
IMethodSymbol
method
,
SyntaxNode
statementToAddAfterOpt
,
TStatementSyntax
statement
);
protected
abstract
ImmutableArray
<
SyntaxNode
>
GetParameters
(
SyntaxNode
node
,
SyntaxGenerator
generator
);
public
override
async
Task
ComputeRefactoringsAsync
(
CodeRefactoringContext
context
)
{
var
(
document
,
textSpan
,
cancellationToken
)
=
context
;
...
...
@@ -42,13 +40,13 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
var
syntaxTree
=
await
document
.
GetSyntaxTreeAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
root
=
await
document
.
GetSyntaxRootAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
token
=
root
.
FindToken
(
position
);
var
firstParameterNode
=
await
context
.
TryGetRelevantNodeAsync
<
TParameterSyntax
>().
ConfigureAwait
(
false
);
if
(
firstParameterNode
==
null
)
var
selectedParameter
=
await
context
.
TryGetRelevantNodeAsync
<
TParameterSyntax
>().
ConfigureAwait
(
false
);
if
(
selectedParameter
==
null
)
{
return
;
}
var
functionDeclaration
=
firstParameterNode
.
FirstAncestorOrSelf
<
SyntaxNode
>(
IsFunctionDeclaration
);
var
functionDeclaration
=
selectedParameter
.
FirstAncestorOrSelf
<
SyntaxNode
>(
IsFunctionDeclaration
);
if
(
functionDeclaration
is
null
)
{
return
;
...
...
@@ -57,75 +55,86 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
var
generator
=
SyntaxGenerator
.
GetGenerator
(
document
);
var
parameterNodes
=
generator
.
GetParameters
(
functionDeclaration
);
var
semanticModel
=
await
document
.
GetSemanticModelAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
syntaxFacts
=
document
.
GetLanguageService
<
ISyntaxFactsService
>();
// List with parameterNodes that pass all checks
var
listOfPotentiallyValidParametersNodes
=
ArrayBuilder
<
SyntaxNode
>.
GetInstance
();
var
counter
=
0
;
// Only offered when there isn't a selection, or the selection exactly selects a parameter name.
if
(!
context
.
Span
.
IsEmpty
)
{
var
parameterName
=
syntaxFacts
.
GetNameOfParameter
(
selectedParameter
);
if
(
parameterName
==
null
||
parameterName
.
Value
.
Span
!=
context
.
Span
)
{
return
;
}
}
parameterNodes
=
GetParameters
(
functionDeclaration
,
generato
r
);
var
parameterDefault
=
syntaxFacts
.
GetDefaultOfParameter
(
selectedParamete
r
);
foreach
(
var
parameterNode
in
parameterNodes
)
// Don't offer inside the "=initializer" of a parameter
if
(
parameterDefault
?.
Span
.
Contains
(
position
)
==
true
)
{
++
counter
;
return
;
}
// Only offered when there isn't a selection, or the selection exactly selects a parameter name.
var
syntaxFacts
=
document
.
GetLanguageService
<
ISyntaxFactsService
>();
if
(!
context
.
Span
.
IsEmpty
)
{
var
parameterName
=
syntaxFacts
.
GetNameOfParameter
(
parameterNode
);
if
(
parameterName
==
null
||
parameterName
.
Value
.
Span
!=
context
.
Span
)
{
continue
;
}
}
// we can't just call GetDeclaredSymbol on functionDeclaration because it could an anonymous function,
// so first we have to get the parameter symbol and then its containing method symbol
if
(!
TryGetParameterSymbol
(
selectedParameter
,
semanticModel
,
out
var
parameter
,
cancellationToken
))
{
return
;
}
var
parameterDefault
=
syntaxFacts
.
GetDefaultOfParameter
(
parameterNode
);
var
methodSymbol
=
(
IMethodSymbol
)
parameter
.
ContainingSymbol
;
if
(
methodSymbol
.
IsAbstract
||
methodSymbol
.
IsExtern
||
methodSymbol
.
PartialImplementationPart
!=
null
||
methodSymbol
.
ContainingType
.
TypeKind
==
TypeKind
.
Interface
)
{
return
;
}
// Don't offer inside the "=initializer" of a parameter
if
(
parameterDefault
?.
Span
.
Contains
(
position
)
==
true
)
{
continue
;
}
if
(
CanOfferRefactoring
(
functionDeclaration
,
semanticModel
,
syntaxFacts
,
cancellationToken
,
out
var
blockStatementOpt
))
{
// Ok. Looks like the selected parameter could be refactored. Defer to subclass to
// actually determine if there are any viable refactorings here.
// we can't just call GetDeclaredSymbol on functionDeclaration because it could an anonymous function,
// so first we have to get the parameter symbol and then its containing method symbol
var
parameter
=
(
IParameterSymbol
)
semanticModel
.
GetDeclaredSymbol
(
parameterNode
,
cancellationToken
);
if
(
parameter
==
null
||
parameter
.
Name
==
""
)
context
.
RegisterRefactorings
(
await
GetRefactoringsForSingleParameterAsync
(
document
,
parameter
,
functionDeclaration
,
methodSymbol
,
blockStatementOpt
,
cancellationToken
).
ConfigureAwait
(
false
));
}
// List with parameterNodes that pass all checks
var
listOfPotentiallyValidParametersNodes
=
ArrayBuilder
<
SyntaxNode
>.
GetInstance
();
foreach
(
var
parameterNode
in
parameterNodes
)
{
if
(!
TryGetParameterSymbol
(
parameterNode
,
semanticModel
,
out
parameter
,
cancellationToken
))
{
return
;
}
var
methodSymbol
=
(
IMethodSymbol
)
parameter
.
ContainingSymbol
;
if
(
methodSymbol
.
IsAbstract
||
methodSymbol
.
IsExtern
||
methodSymbol
.
PartialImplementationPart
!=
null
||
methodSymbol
.
ContainingType
.
TypeKind
==
TypeKind
.
Interface
)
{
continue
;
}
// Update the list of valid parameter nodes
listOfPotentiallyValidParametersNodes
.
Add
(
parameterNode
);
}
if
(
listOfPotentiallyValidParametersNodes
.
Count
>
1
)
{
// Looks like we can offer a refactoring for more than one parameter. Defer to subclass to
// actually determine if there are any viable refactorings here.
context
.
RegisterRefactorings
(
await
GetRefactoringsForAllParametersAsync
(
document
,
functionDeclaration
,
methodSymbol
,
blockStatementOpt
,
listOfPotentiallyValidParametersNodes
.
ToImmutableAndFree
(),
position
,
cancellationToken
).
ConfigureAwait
(
false
));
}
if
(
CanOfferRefactoring
(
functionDeclaration
,
semanticModel
,
syntaxFacts
,
cancellationToken
,
out
var
blockStatementOpt
))
bool
TryGetParameterSymbol
(
SyntaxNode
parameterNode
,
SemanticModel
semanticModel
,
out
IParameterSymbol
parameter
,
CancellationToken
cancellationToken
)
{
parameter
=
(
IParameterSymbol
)
semanticModel
.
GetDeclaredSymbol
(
parameterNode
,
cancellationToken
);
if
(
parameter
==
null
||
parameter
.
Name
==
""
)
{
// Ok. Looks like there is at least one reasonable parameter to analyze. Defer to subclass to
// actually determine if there are any viable refactorings here.
// Update the list of valid parameter nodes
listOfPotentiallyValidParametersNodes
.
Add
(
parameterNode
);
// For single parameter - Only offers for the parameter cursor is on
if
(
firstParameterNode
==
parameterNode
)
{
context
.
RegisterRefactorings
(
await
GetRefactoringsForSingleParameterAsync
(
document
,
parameter
,
functionDeclaration
,
methodSymbol
,
blockStatementOpt
,
cancellationToken
).
ConfigureAwait
(
false
));
}
// Calls for a multiple null check only when this is the last iteration and there's more than one possible valid parameter parameter
if
(
listOfPotentiallyValidParametersNodes
.
Count
>
1
&&
counter
==
parameterNodes
.
Count
)
{
context
.
RegisterRefactorings
(
await
GetRefactoringsForAllParametersAsync
(
document
,
functionDeclaration
,
methodSymbol
,
blockStatementOpt
,
listOfPotentiallyValidParametersNodes
.
ToImmutableAndFree
(),
position
,
cancellationToken
).
ConfigureAwait
(
false
));
}
return
false
;
}
return
true
;
}
}
...
...
@@ -159,8 +168,8 @@ protected bool CanOfferRefactoring(SyntaxNode functionDeclaration, SemanticModel
return
true
;
}
//In order to get the block operation for the body of an anonymous function, we need to
//
get it via `IAnonymousFunctionOperation.Body` instead of getting it directly from the body syntax.GetBlockStatmentOpt does that
.
//
In order to get the block operation for the body of an anonymous function, we need to
//
get it via `IAnonymousFunctionOperation.Body` instead of getting it directly from the body syntax
.
var
operation
=
semanticModel
.
GetOperation
(
syntaxFacts
.
IsAnonymousFunction
(
functionDeclaration
)
?
functionDeclaration
:
functionBody
,
...
...
src/Features/VisualBasic/Portable/InitializeParameter/InitializeParameterHelpers.vb
浏览文件 @
a91c6ee9
...
...
@@ -16,16 +16,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.InitializeParameter
Return
node
End
Function
Public
Shared
Function
GetParameters
(
node
As
SyntaxNode
,
generator
As
SyntaxGenerator
)
As
ImmutableArray
(
Of
SyntaxNode
)
If
node
.
GetType
()
=
GetType
(
LambdaExpressionSyntax
)
Then
Dim
simpleLambda
=
DirectCast
(
node
,
LambdaExpressionSyntax
)
Dim
simpleLambdaHeader
=
simpleLambda
.
SubOrFunctionHeader
.
GetParameterList
.
Parameters
Return
simpleLambdaHeader
.
Cast
(
Of
SyntaxNode
).
ToImmutableArray
()
End
If
Return
generator
.
GetParameters
(
node
).
ToImmutableArray
()
End
Function
Private
Shared
Function
GetStatements
(
functionDeclaration
As
SyntaxNode
)
As
SyntaxList
(
Of
StatementSyntax
)
If
TypeOf
functionDeclaration
Is
MethodBlockBaseSyntax
Then
Dim
methodBlock
=
DirectCast
(
functionDeclaration
,
MethodBlockBaseSyntax
)
...
...
src/Features/VisualBasic/Portable/InitializeParameter/VisualBasicAddParameterCheckCodeRefactoringProvider.vb
浏览文件 @
a91c6ee9
...
...
@@ -48,8 +48,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.InitializeParameter
Return
InitializeParameterHelpers
.
GetBody
(
functionDeclaration
)
End
Function
Protected
Overrides
Function
GetParameters
(
node
As
SyntaxNode
,
generator
As
SyntaxGenerator
)
As
ImmutableArray
(
Of
SyntaxNode
)
Return
InitializeParameterHelpers
.
GetParameters
(
node
,
generator
)
End
Function
End
Class
End
Namespace
src/Features/VisualBasic/Portable/InitializeParameter/VisualBasicInitializeMemberFromParameterCodeRefactoringProvider.vb
浏览文件 @
a91c6ee9
...
...
@@ -56,8 +56,5 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.InitializeParameter
Return
InitializeParameterHelpers
.
GetBody
(
functionDeclaration
)
End
Function
Protected
Overrides
Function
GetParameters
(
node
As
SyntaxNode
,
generator
As
SyntaxGenerator
)
As
ImmutableArray
(
Of
SyntaxNode
)
Return
InitializeParameterHelpers
.
GetParameters
(
node
,
generator
)
End
Function
End
Class
End
Namespace
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录