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

2024-04-02

我想创建一个 Roslyn 诊断分析器来查找隐式转换,特别是如下构造:

DateTimeOffset v = new DateTime();

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

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

我的问题是是否有上述方法的替代方法。具体来说,是否可以编写一个针对语义模型运行的 Roslyn 诊断分析器?或者我错过了什么并且有比我上面描述的更好的选择吗?


我相信你在这里是不正确的:

但问题是 Roslyn 诊断分析器工作于语法,而不是语义模型。

您可以注册诊断分析器来针对语法、语义模型或​​更高级别的“操作”类型进行工作。例如,Kasey Uhlenhuth 有一个example https://github.com/kuhlenh/demofodder/blob/master/IOperationZeroSizeArrayAnalyzer_End/ZeroSizeArrayAnalyzer/ZeroSizeArrayAnalyzer/DiagnosticAnalyzer.cs检测零长度数组的创建。

您可以致电AnalysisContext.RegisterSemanticModelAction or AnalysisContext.RegisterOperationAction。您可能很想注册操作类型为Conversion- 这可能会消除很多工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Roslyn 诊断分析器中检测隐式转换 的相关文章

随机推荐