【问题标题】:Detecting implicit casts in a Roslyn diagnostic analyzer在 Roslyn 诊断分析器中检测隐式强制转换
【发布时间】:2018-06-21 21:47:41
【问题描述】:

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

DateTimeOffset v = new DateTime();

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

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

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

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    我认为你在这里是不正确的:

    但问题在于 Roslyn 诊断分析器处理的是语法,而不是语义模型。

    您可以注册诊断分析器以针对语法、语义模型或​​更高级别的“操作”类型工作。例如,Kasey Uhlenhuth 有一个 example 检测零长度数组的创建。

    您可以致电AnalysisContext.RegisterSemanticModelActionAnalysisContext.RegisterOperationAction。您可能希望使用 Conversion 的操作类型注册操作 - 这可能会删除很多工作。

    【讨论】:

    • 谢谢。我试试看。
    • 我试过了,效果很好。我遇到的唯一问题是 Visual Studio 中的项目模板使用旧的 Roslyn 依赖项,这在 VS2017 中不起作用。更新 NuGet 包解决了这个问题。
    • @PietervanGinkel 你能分享你的解决方案吗?我刚开始使用 Roslyn,我不知道该怎么做。 :\
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多