Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
0cb2be7d
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,发现更多精彩内容 >>
提交
0cb2be7d
编写于
8月 18, 2017
作者:
C
CyrusNajmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Extract method.
上级
4df31f51
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
33 addition
and
26 deletion
+33
-26
src/Features/Core/Portable/UseThrowExpression/AbstractUseThrowExpressionDiagnosticAnalyzer.cs
...xpression/AbstractUseThrowExpressionDiagnosticAnalyzer.cs
+33
-26
未找到文件。
src/Features/Core/Portable/UseThrowExpression/AbstractUseThrowExpressionDiagnosticAnalyzer.cs
浏览文件 @
0cb2be7d
...
...
@@ -85,7 +85,7 @@ private void AnalyzeOperation(OperationAnalysisContext context, INamedTypeSymbol
{
return
;
}
var
option
=
optionSet
.
GetOption
(
CodeStyleOptions
.
PreferThrowExpression
,
throwStatement
.
Language
);
if
(!
option
.
Value
)
{
...
...
@@ -129,37 +129,16 @@ private void AnalyzeOperation(OperationAnalysisContext context, INamedTypeSymbol
}
if
(!
TryFindAssignmentExpression
(
containingBlock
,
ifOperation
,
localOrParameter
,
out
var
expressionStatement
,
out
var
assignmentExpression
))
out
var
expressionStatement
,
out
var
assignmentExpression
))
{
return
;
}
// We found an assignment using this local/parameter. Now, just make sure there
// were no intervening accesses between the check and the assignment.
var
statements
=
containingBlock
.
Statements
;
var
ifOperationIndex
=
statements
.
IndexOf
(
ifOperation
);
var
expressionStatementIndex
=
statements
.
IndexOf
(
expressionStatement
);
if
(
expressionStatementIndex
>
ifOperationIndex
+
1
)
{
// There are intermediary statements between the check and the assignment.
// Make sure they don't try to access the local.
var
dataFlow
=
semanticModel
.
AnalyzeDataFlow
(
statements
[
ifOperationIndex
+
1
].
Syntax
,
statements
[
expressionStatementIndex
-
1
].
Syntax
);
if
(
dataFlow
.
ReadInside
.
Contains
(
localOrParameter
)
||
dataFlow
.
WrittenInside
.
Contains
(
localOrParameter
))
{
return
;
}
}
// Also, have to make sure there is no read/write of the local/parameter on the left
// of the assignment. For example: map[val.Id] = val;
var
exprDataFlow
=
semanticModel
.
AnalyzeDataFlow
(
assignmentExpression
.
Target
.
Syntax
);
if
(
exprDataFlow
.
ReadInside
.
Contains
(
localOrParameter
)
||
exprDataFlow
.
WrittenInside
.
Contains
(
localOrParameter
))
if
(
ValueIsAccessed
(
semanticModel
,
ifOperation
,
containingBlock
,
localOrParameter
,
expressionStatement
,
assignmentExpression
))
{
return
;
}
...
...
@@ -197,6 +176,34 @@ private void AnalyzeOperation(OperationAnalysisContext context, INamedTypeSymbol
}
}
private
static
bool
ValueIsAccessed
(
SemanticModel
semanticModel
,
IIfStatement
ifOperation
,
IBlockStatement
containingBlock
,
ISymbol
localOrParameter
,
IExpressionStatement
expressionStatement
,
IAssignmentExpression
assignmentExpression
)
{
var
statements
=
containingBlock
.
Statements
;
var
ifOperationIndex
=
statements
.
IndexOf
(
ifOperation
);
var
expressionStatementIndex
=
statements
.
IndexOf
(
expressionStatement
);
if
(
expressionStatementIndex
>
ifOperationIndex
+
1
)
{
// There are intermediary statements between the check and the assignment.
// Make sure they don't try to access the local.
var
dataFlow
=
semanticModel
.
AnalyzeDataFlow
(
statements
[
ifOperationIndex
+
1
].
Syntax
,
statements
[
expressionStatementIndex
-
1
].
Syntax
);
if
(
dataFlow
.
ReadInside
.
Contains
(
localOrParameter
)
||
dataFlow
.
WrittenInside
.
Contains
(
localOrParameter
))
{
return
true
;
}
}
// Also, have to make sure there is no read/write of the local/parameter on the left
// of the assignment. For example: map[val.Id] = val;
var
exprDataFlow
=
semanticModel
.
AnalyzeDataFlow
(
assignmentExpression
.
Target
.
Syntax
);
return
exprDataFlow
.
ReadInside
.
Contains
(
localOrParameter
)
||
exprDataFlow
.
WrittenInside
.
Contains
(
localOrParameter
);
}
protected
abstract
ISyntaxFactsService
GetSyntaxFactsService
();
protected
abstract
ISemanticFactsService
GetSemanticFactsService
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录