我能检测到(使用roslyn) lambda body中的x引用是外部变量x的闭包,而不是lambda本身的局部变量吗?
var x = "foo";
var a = string[0];
a.Any(i => i == x);发布于 2015-05-20 03:36:15
是啊。您可以使用DataFlowAnalysis接口。
var tree = CSharpSyntaxTree.ParseText(
@"
class C{
void M(){
var x = ""foo"";
var a = new string[0];
var testing = a.Any(i => i == x);
}
}
");
var Mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
var compilation = CSharpCompilation.Create("MyCompilation",
syntaxTrees: new[] { tree }, references: new[] { Mscorlib });
var model = compilation.GetSemanticModel(tree);
var lambda = tree.GetRoot().DescendantNodes().OfType<LocalDeclarationStatementSyntax>().Last();
var dataFlowAnalysis = model.AnalyzeDataFlow(lambda);
var capturedVariables = dataFlowAnalysis.Captured;
foreach(var variable in capturedVariables)
{
//Do something
}发布于 2015-05-21 10:28:56
(1)获取语义模型
(2)检查AnonymousMethodExpressionSyntax / SimpleLambdaExpressionSyntax / ParenthesizedLambdaExpressionSyntax
(3)将该节点传递给SemanticModel上的AnalyzeDataFlow扩展方法
(4)遍历.Captured属性
https://stackoverflow.com/questions/30300753
复制相似问题