在Roslyn诊断分析器中检测隐式转换

时间:2018-06-21 13:19:27

标签: c# roslyn

我想创建一个Roslyn诊断分析器来查找隐式强制类型转换,特别是以下结构:

DateTimeOffset v = new DateTime();

这意味着我要么必须检测隐式强制转换,要么要找到对DateTimeOffset.op_Implicit(DateTime)的引用。

问题是Roslyn诊断分析器使用语法而不是语义模型。因此,我能想到的唯一方法是找出所有可能在其中隐式转换的语法构造,并对它们进行语义分析。但是,这非常棘手,因为即使我能够创建一个可以生成隐式强制转换的详尽语法结构列表,对语言的更改也可以轻松引入新的语法结构。

我的问题是上述方法是否有另一种方法。 特别是,有可能编写一个与语义模型相对应的Roslyn诊断分析器吗?还是我错过了一些东西,并且有比我上面描述的更好的选择吗?

1 个答案:

答案 0 :(得分:3)

我相信您在这里不正确:

  

问题是Roslyn诊断分析器只使用语法,而不是语义模型。

您可以注册诊断分析器以使用语法,语义模型或​​什至更高级别的“操作”类型。例如,Kasey Uhlenhuth的example检测到零长度数组的创建。

您可以致电AnalysisContext.RegisterSemanticModelActionAnalysisContext.RegisterOperationAction。您可能想注册一种操作类型为Conversion的操作-这可能会删除很多工作。