我想创建一个 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(使用前将#替换为@)