Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
4459a443
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,发现更多精彩内容 >>
未验证
提交
4459a443
编写于
1月 29, 2019
作者:
M
Manish Vasani
提交者:
GitHub
1月 29, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #32929 from mavasani/Issue32903
Bail out on delegate creation wrapped a in tuple operation
上级
ac760a66
af89fd82
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
52 addition
and
1 deletion
+52
-1
src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs
...edParametersAndValues/RemoveUnusedValueAssignmentTests.cs
+24
-0
src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs
...esDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs
+28
-1
未找到文件。
src/EditorFeatures/CSharpTest/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs
浏览文件 @
4459a443
...
...
@@ -6079,6 +6079,30 @@ int Method()
[|target|] = 1;
return data[0];
}
}"
,
optionName
);
}
[
WorkItem
(
32903
,
"https://github.com/dotnet/roslyn/issues/32903"
)]
[
Theory
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsRemoveUnusedValues
)]
[
InlineData
(
nameof
(
PreferDiscard
))]
[
InlineData
(
nameof
(
PreferUnusedLocal
))]
public
async
Task
DelegateCreationWrappedInATuple_UsedInReturnedLambda
(
string
optionName
)
{
await
TestMissingInRegularAndScriptAsync
(
@"using System;
public class C
{
private (int, int) createTuple() => (1, 1);
public (Func<int>, bool) M()
{
var ([|value1, value2|]) = createTuple();
int LocalFunction() => value1 + value2;
return (LocalFunction, true);
}
}"
,
optionName
);
}
}
...
...
src/Features/Core/Portable/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs
浏览文件 @
4459a443
...
...
@@ -42,6 +42,12 @@ private sealed partial class BlockAnalyzer
/// </summary>
private
bool
_delegateAssignedToFieldOrProperty
;
/// <summary>
/// Indicates if a delegate was wrapped within an <see cref="ITupleOperation"/>.
/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol)"/> to determine whether to bail from analysis or not.
/// </summary>
private
bool
_delegateWrappedInTuple
;
/// <summary>
/// Indicates if the operation block has an <see cref="IConversionOperation"/> with a delegate type or an anonymous function
/// as it's source and a non-delegate type as it's target.
...
...
@@ -93,6 +99,7 @@ public static void Analyze(OperationBlockStartAnalysisContext context, SymbolSta
context
.
RegisterOperationAction
(
blockAnalyzer
.
AnalyzeDelegateCreationOrAnonymousFunction
,
OperationKind
.
DelegateCreation
,
OperationKind
.
AnonymousFunction
);
context
.
RegisterOperationAction
(
blockAnalyzer
.
AnalyzeArgument
,
OperationKind
.
Argument
);
context
.
RegisterOperationAction
(
blockAnalyzer
.
AnalyzeConversion
,
OperationKind
.
Conversion
);
context
.
RegisterOperationAction
(
blockAnalyzer
.
AnalyzeTuple
,
OperationKind
.
Tuple
);
context
.
RegisterOperationAction
(
blockAnalyzer
.
AnalyzeFieldOrPropertyReference
,
OperationKind
.
FieldReference
,
OperationKind
.
PropertyReference
);
context
.
RegisterOperationAction
(
blockAnalyzer
.
AnalyzeParameterReference
,
OperationKind
.
ParameterReference
);
context
.
RegisterOperationBlockEndAction
(
blockAnalyzer
.
AnalyzeOperationBlockEnd
);
...
...
@@ -204,6 +211,16 @@ private void AnalyzeConversion(OperationAnalysisContext operationAnalysisContext
}
}
private
void
AnalyzeTuple
(
OperationAnalysisContext
operationAnalysisContext
)
{
var
tupleOperation
=
(
ITupleOperation
)
operationAnalysisContext
.
Operation
;
if
(!
_delegateWrappedInTuple
&&
tupleOperation
.
Elements
.
Any
(
o
=>
o
.
Type
.
IsDelegateType
()))
{
_delegateWrappedInTuple
=
true
;
}
}
private
void
AnalyzeFieldOrPropertyReference
(
OperationAnalysisContext
operationAnalysisContextContext
)
{
var
fieldOrPropertyReference
=
operationAnalysisContextContext
.
Operation
;
...
...
@@ -285,7 +302,17 @@ private bool ShouldAnalyze(IOperation operationBlock, ISymbol owningSymbol)
return
false
;
}
// 6. Otherwise, we execute analysis by walking the reaching symbol write chain to attempt to
// 6. Bail out if we have a delegate wrapped in a tuple.
// This indicates the delegate targets (such as lambda/local functions) have been wrapped
// within a tuple and passed around and invoked, and these invocations can read values written
// to any local/parameter in the current method. We cannot reliably flag any write to a
// local/parameter as unused for such cases.
if
(
_delegateWrappedInTuple
)
{
return
false
;
}
// 7. Otherwise, we execute analysis by walking the reaching symbol write chain to attempt to
// find the target method being invoked.
// This works for most common and simple cases where a local is assigned a lambda and invoked later.
// If we are unable to find a target, we will conservatively mark all current symbol writes as read.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录