在 Roslyn 诊断分析器中检测隐式转换
Detecting implicit casts in a Roslyn diagnostic analyzer
我想创建一个 Roslyn 诊断分析器来查找隐式转换,特别是像这样的构造:
DateTimeOffset v = new DateTime();
这意味着我要么必须检测隐式转换,要么找到对 DateTimeOffset.op_Implicit(DateTime)
.
的引用
但问题是 Roslyn 诊断分析器处理语法,而不是语义模型。因此,我能想到的唯一方法是找出所有可能具有隐式转换的语法结构,并对这些结构进行 运行 语义分析。然而,这非常棘手,因为即使我能够创建一个详尽的语法结构列表来生成隐式转换,对语言的更改也很容易引入新的语法结构。
我的问题是是否有替代上述方法的方法。 具体来说,是否可以编写一个 运行 反对语义模型的 Roslyn 诊断分析器? 或者我错过了什么并且有比我上面描述的更好的选择吗?
我认为你在这里是不正确的:
The problem though is that Roslyn diagnostic analyzers work on syntax, not the semantic model.
您可以注册诊断分析器来处理语法、语义模型或更高级别的 "operation" 类型。例如,Kasey Uhlenhuth 有一个 example 检测零长度数组的创建。
您可以拨打AnalysisContext.RegisterSemanticModelAction
或AnalysisContext.RegisterOperationAction
。您可能希望注册操作类型为 Conversion
的操作 - 这可能会减少很多工作。
我想创建一个 Roslyn 诊断分析器来查找隐式转换,特别是像这样的构造:
DateTimeOffset v = new DateTime();
这意味着我要么必须检测隐式转换,要么找到对 DateTimeOffset.op_Implicit(DateTime)
.
但问题是 Roslyn 诊断分析器处理语法,而不是语义模型。因此,我能想到的唯一方法是找出所有可能具有隐式转换的语法结构,并对这些结构进行 运行 语义分析。然而,这非常棘手,因为即使我能够创建一个详尽的语法结构列表来生成隐式转换,对语言的更改也很容易引入新的语法结构。
我的问题是是否有替代上述方法的方法。 具体来说,是否可以编写一个 运行 反对语义模型的 Roslyn 诊断分析器? 或者我错过了什么并且有比我上面描述的更好的选择吗?
我认为你在这里是不正确的:
The problem though is that Roslyn diagnostic analyzers work on syntax, not the semantic model.
您可以注册诊断分析器来处理语法、语义模型或更高级别的 "operation" 类型。例如,Kasey Uhlenhuth 有一个 example 检测零长度数组的创建。
您可以拨打AnalysisContext.RegisterSemanticModelAction
或AnalysisContext.RegisterOperationAction
。您可能希望注册操作类型为 Conversion
的操作 - 这可能会减少很多工作。