【发布时间】:2018-07-24 15:38:22
【问题描述】:
下面的代码sn-p就是我要分析的代码:
var name = "Michael";
name = "John";
var person = new Person(name);
如果Person 的constructor 的name 长度小于5,假设我的分析器应该报错。
我知道如何获取传递给此对象创建表达式的字符串文字 var person = new Person("John") 的值,检查第一个参数类型,然后如果它是字符串文字,则获取 Value 属性。
但是我如何让分析器在Person 对象创建表达式站点上给我name 的值。这个name在代码中定义的很清楚,所以在这种情况下应该是可能的。
到目前为止,我已经尝试过类似...
var nameExpr = (IdentifierNameSyntax)objectCreation.ArgumentList?.Arguments.First()?.Expression;
var nameDataFlow = context.SemanticModel.AnalyzeDataFlow(nameExpr);
看起来我可以通过使用这个数据流来计算 name 的值,但它似乎涉及一组非常复杂和易碎的代码,而且在我看来只有在声明在里面时才能工作数据流代码块。我希望它能够将此令牌解析为它的实际值(如果可能的话),即使在全局编译中也是如此。
即使我自己编写了全局编译钩子,我也必须手动跟踪对变量的每个赋值(包括来自其他变量和方法调用等)
有没有简单的方法让库为我做这件事,如果可以的话,只需在调用站点给我变量的值?
【问题讨论】:
-
分析器在编译时运行。您无法构建始终知道变量的运行时值是什么的编译时工具。想象一下,您为
name分配了一个来自用户输入的值(例如来自Console.ReadLine()) -
是的,我对此进行了更多研究,目前 roslyn 似乎没有针对此的算法。但它可以实现,如果它最终解析为一个表达式(而不是一个值),那么我可以在此基础上进行一些分析,即使在多线程环境中,我也可以报告它的可能值,如果分析达到一定的复杂性然后我终于可以放弃它并说“我不知道”这个变量的值是或可能是什么。
标签: c# roslyn code-analysis roslyn-code-analysis