Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
250d883c
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,发现更多精彩内容 >>
提交
250d883c
编写于
12月 06, 2017
作者:
S
Steve Chovanec
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Refactor so that GetSymbolInfo can be called last
上级
4bd68ef0
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
57 addition
and
42 deletion
+57
-42
src/Features/CSharp/Portable/UseNullPropagation/CSharpUseNullPropagationDiagnosticAnalyzer.cs
...Propagation/CSharpUseNullPropagationDiagnosticAnalyzer.cs
+10
-5
src/Features/Core/Portable/UseNullPropagation/AbstractUseNullPropagationDiagnosticAnalyzer.cs
...opagation/AbstractUseNullPropagationDiagnosticAnalyzer.cs
+45
-34
src/Features/VisualBasic/Portable/UseNullPropagation/VisualBasicUseNullPropagationDiagnosticAnalyzer.vb
...gation/VisualBasicUseNullPropagationDiagnosticAnalyzer.vb
+2
-3
未找到文件。
src/Features/CSharp/Portable/UseNullPropagation/CSharpUseNullPropagationDiagnosticAnalyzer.cs
浏览文件 @
250d883c
...
...
@@ -38,10 +38,11 @@ protected override bool IsEquals(BinaryExpressionSyntax condition)
protected
override
bool
IsNotEquals
(
BinaryExpressionSyntax
condition
)
=>
condition
.
Kind
()
==
SyntaxKind
.
NotEqualsExpression
;
protected
override
bool
TryAnalyzePatternCondition
(
SyntaxNode
conditionNode
,
out
SyntaxNode
conditionLeft
,
out
SyntaxNode
conditionRight
,
out
bool
isEquals
)
protected
override
bool
TryAnalyzePatternCondition
(
ISyntaxFactsService
syntaxFacts
,
SyntaxNode
conditionNode
,
out
SyntaxNode
conditionPartToCheck
,
out
bool
isEquals
)
{
conditionLeft
=
null
;
conditionRight
=
null
;
conditionPartToCheck
=
null
;
isEquals
=
true
;
var
patternExpression
=
conditionNode
as
IsPatternExpressionSyntax
;
...
...
@@ -56,8 +57,12 @@ protected override bool TryAnalyzePatternCondition(SyntaxNode conditionNode, out
return
false
;
}
conditionLeft
=
patternExpression
.
Expression
;
conditionRight
=
constantPattern
.
Expression
;
if
(!
syntaxFacts
.
IsNullLiteralExpression
(
constantPattern
.
Expression
))
{
return
false
;
}
conditionPartToCheck
=
patternExpression
.
Expression
;
return
true
;
}
}
...
...
src/Features/Core/Portable/UseNullPropagation/AbstractUseNullPropagationDiagnosticAnalyzer.cs
浏览文件 @
250d883c
...
...
@@ -50,7 +50,9 @@ protected AbstractUseNullPropagationDiagnosticAnalyzer()
protected
abstract
ISyntaxFactsService
GetSyntaxFactsService
();
protected
abstract
ISemanticFactsService
GetSemanticFactsService
();
protected
abstract
bool
TryAnalyzePatternCondition
(
SyntaxNode
conditionNode
,
out
SyntaxNode
conditionLeft
,
out
SyntaxNode
conditionRight
,
out
bool
isEquals
);
protected
abstract
bool
TryAnalyzePatternCondition
(
ISyntaxFactsService
syntaxFacts
,
SyntaxNode
conditionNode
,
out
SyntaxNode
conditionPartToCheck
,
out
bool
isEquals
);
protected
override
void
InitializeWorker
(
AnalysisContext
context
)
{
...
...
@@ -100,26 +102,12 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context, INamedTypeSymbol e
var
isEqualityLikeCondition
=
TryAnalyzeCondition
(
context
,
syntaxFacts
,
referenceEqualsMethodOpt
,
conditionNode
,
out
var
condition
Left
,
out
var
conditionRight
,
out
var
isEquals
);
out
var
condition
PartToCheck
,
out
var
isEquals
);
if
(!
isEqualityLikeCondition
)
{
return
;
}
var
conditionLeftIsNull
=
syntaxFacts
.
IsNullLiteralExpression
(
conditionLeft
);
var
conditionRightIsNull
=
syntaxFacts
.
IsNullLiteralExpression
(
conditionRight
);
if
(
conditionRightIsNull
&&
conditionLeftIsNull
)
{
// null == null nothing to do here.
return
;
}
if
(!
conditionRightIsNull
&&
!
conditionLeftIsNull
)
{
return
;
}
// Needs to be of the form:
// x == null ? null : ... or
// x != null ? ... : null;
...
...
@@ -133,7 +121,6 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context, INamedTypeSymbol e
return
;
}
var
conditionPartToCheck
=
conditionRightIsNull
?
conditionLeft
:
conditionRight
;
var
whenPartToCheck
=
isEquals
?
whenFalseNode
:
whenTrueNode
;
var
semanticFacts
=
GetSemanticFactsService
();
...
...
@@ -186,49 +173,48 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context, INamedTypeSymbol e
private
bool
TryAnalyzeCondition
(
SyntaxNodeAnalysisContext
context
,
ISyntaxFactsService
syntaxFacts
,
IMethodSymbol
referenceEqualsMethodOpt
,
SyntaxNode
conditionNode
,
out
SyntaxNode
condition
Left
,
out
SyntaxNode
conditionRight
,
out
bool
isEquals
)
out
SyntaxNode
condition
PartToCheck
,
out
bool
isEquals
)
{
switch
(
conditionNode
)
{
case
TBinaryExpressionSyntax
binaryExpression
:
return
TryAnalyzeBinaryExpressionCondition
(
syntaxFacts
,
binaryExpression
,
out
condition
Left
,
out
conditionRight
,
out
isEquals
);
syntaxFacts
,
binaryExpression
,
out
condition
PartToCheck
,
out
isEquals
);
case
TInvocationExpression
invocation
:
return
TryAnalyzeInvocationCondition
(
context
,
syntaxFacts
,
referenceEqualsMethodOpt
,
invocation
,
out
condition
Left
,
out
conditionRight
,
out
isEquals
);
out
condition
PartToCheck
,
out
isEquals
);
default
:
return
TryAnalyzePatternCondition
(
conditionNode
,
out
conditionLeft
,
out
conditionRight
,
out
isEquals
);
syntaxFacts
,
conditionNode
,
out
conditionPartToCheck
,
out
isEquals
);
}
}
private
bool
TryAnalyzeBinaryExpressionCondition
(
ISyntaxFactsService
syntaxFacts
,
TBinaryExpressionSyntax
condition
,
out
SyntaxNode
condition
Left
,
out
SyntaxNode
conditionRight
,
out
bool
isEquals
)
out
SyntaxNode
condition
PartToCheck
,
out
bool
isEquals
)
{
isEquals
=
IsEquals
(
condition
);
if
(!
isEquals
&&
!
IsNotEquals
(
condition
))
{
conditionLeft
=
null
;
conditionRight
=
null
;
conditionPartToCheck
=
null
;
return
false
;
}
else
{
syntaxFacts
.
GetPartsOfBinaryExpression
(
condition
,
out
conditionLeft
,
out
conditionRight
);
return
true
;
syntaxFacts
.
GetPartsOfBinaryExpression
(
condition
,
out
var
conditionLeft
,
out
var
conditionRight
);
conditionPartToCheck
=
GetConditionPartToCheck
(
syntaxFacts
,
conditionLeft
,
conditionRight
);
return
conditionPartToCheck
!=
null
;
}
}
private
static
bool
TryAnalyzeInvocationCondition
(
SyntaxNodeAnalysisContext
context
,
ISyntaxFactsService
syntaxFacts
,
IMethodSymbol
referenceEqualsMethodOpt
,
TInvocationExpression
invocation
,
out
SyntaxNode
condition
Left
,
out
SyntaxNode
conditionRight
,
out
bool
isEquals
)
out
SyntaxNode
condition
PartToCheck
,
out
bool
isEquals
)
{
conditionLeft
=
null
;
conditionRight
=
null
;
conditionPartToCheck
=
null
;
isEquals
=
true
;
var
expression
=
syntaxFacts
.
GetExpressionOfInvocationExpression
(
invocation
);
...
...
@@ -255,17 +241,42 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context, INamedTypeSymbol e
return
false
;
}
var
conditionLeft
=
syntaxFacts
.
GetExpressionOfArgument
(
arguments
[
0
]);
var
conditionRight
=
syntaxFacts
.
GetExpressionOfArgument
(
arguments
[
1
]);
if
(
conditionLeft
==
null
||
conditionRight
==
null
)
{
return
false
;
}
conditionPartToCheck
=
GetConditionPartToCheck
(
syntaxFacts
,
conditionLeft
,
conditionRight
);
if
(
conditionPartToCheck
==
null
)
{
return
false
;
}
var
semanticModel
=
context
.
SemanticModel
;
var
cancellationToken
=
context
.
CancellationToken
;
var
symbol
=
semanticModel
.
GetSymbolInfo
(
invocation
,
cancellationToken
).
Symbol
;
if
(!
referenceEqualsMethodOpt
.
Equals
(
symbol
))
return
referenceEqualsMethodOpt
.
Equals
(
symbol
);
}
private
static
SyntaxNode
GetConditionPartToCheck
(
ISyntaxFactsService
syntaxFacts
,
SyntaxNode
conditionLeft
,
SyntaxNode
conditionRight
)
{
var
conditionLeftIsNull
=
syntaxFacts
.
IsNullLiteralExpression
(
conditionLeft
);
var
conditionRightIsNull
=
syntaxFacts
.
IsNullLiteralExpression
(
conditionRight
);
if
(
conditionRightIsNull
&&
conditionLeftIsNull
)
{
return
false
;
// null == null nothing to do here.
return
null
;
}
if
(!
conditionRightIsNull
&&
!
conditionLeftIsNull
)
{
return
null
;
}
conditionLeft
=
syntaxFacts
.
GetExpressionOfArgument
(
arguments
[
0
]);
conditionRight
=
syntaxFacts
.
GetExpressionOfArgument
(
arguments
[
1
]);
return
conditionLeft
!=
null
&&
conditionRight
!=
null
;
return
conditionRightIsNull
?
conditionLeft
:
conditionRight
;
}
internal
static
SyntaxNode
GetWhenPartMatch
(
...
...
src/Features/VisualBasic/Portable/UseNullPropagation/VisualBasicUseNullPropagationDiagnosticAnalyzer.vb
浏览文件 @
250d883c
...
...
@@ -42,9 +42,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseNullPropagation
Return
condition
.
Kind
()
=
SyntaxKind
.
IsNotExpression
End
Function
Protected
Overrides
Function
TryAnalyzePatternCondition
(
conditionNode
As
SyntaxNode
,
ByRef
conditionLeft
As
SyntaxNode
,
ByRef
conditionRight
As
SyntaxNode
,
ByRef
isEquals
As
Boolean
)
As
Boolean
conditionLeft
=
Nothing
conditionRight
=
Nothing
Protected
Overrides
Function
TryAnalyzePatternCondition
(
syntaxFacts
As
ISyntaxFactsService
,
conditionNode
As
SyntaxNode
,
ByRef
conditionPartToCheck
As
SyntaxNode
,
ByRef
isEquals
As
Boolean
)
As
Boolean
conditionPartToCheck
=
Nothing
isEquals
=
False
Return
False
End
Function
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录