c# - Roslyn 分析器未检测 While 表达式

标签 c# .net roslyn-code-analysis

我编写了一个小型自定义 Rosyln 分析器,用于检查某些方法调用,以及它们是否在循环上下文或表达式中执行。我想要警告的代码示例如下:

IMessageHandlerContext context = default;

foreach (var item in dataItems)
{
    await context.Send<IProcessItem>(m =>
    {
        m.Item = "my-item-id";
    });
}

我执行两阶段分析,首先通过查看方法名称来检查方法调用是否是我特别感兴趣的方法调用。第二个更改是查看更广泛的上下文,并测试调用是否发生在循环上下文或表达式内。分析器适用于 For 和 ForEach 构造,但无法突出显示 While 循环表达式。我对第一阶段(查看方法名称)工作正常感到满意。

private void CheckForMethodInvocationInLoop(SyntaxNodeAnalysisContext context)
{
    var invocation = (InvocationExpressionSyntax)context.Node;

    var containsMethod = false;
    // Removed stage one code for brevity

    if (!containsMethod)
        return;

    var loopFound = invocation.FirstAncestorOrSelf<StatementSyntax>(ss => 
        ss.IsKind(SyntaxKind.ForStatement) || 
        ss.IsKind(SyntaxKind.ForEachStatement) || 
        ss.IsKind(SyntaxKind.WhileStatement));

    if (loopFound != null)
    {
        context.ReportDiagnostic(Diagnostic.Create(Rule, invocation.GetLocation()));
    }
}

分析器正确突出显示 For 和 ForEach 表达式中的方法调用,但无法识别 While 表达式中的相同调用。

ForEach 表达式内部调用,语法高亮

Invocation inside ForEach expression, syntax hightlighting

While 表达式内调用,无语法高亮

Invocation inside While expression, no syntax highlighting

我尝试了几种技术来检查调用上下文。首先,通过递归检查调用语句上的每个父级及其父级。我还尝试在调用本身上使用方法 FirstAncestorOrSelf 来测试某种 Statement。通过检查语法可视化工具,我无法确定为什么分析器无法识别 While 表达式内的调用。

最佳答案

所以我看了你的仓库,然后 fixing a few quick things (例如您的主项目中没有引用分析器,或者分析器必须针对 netstandard2.0 构建)诊断按预期工作:

demo

关于c# - Roslyn 分析器未检测 While 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75235610/

相关文章:

c# - 从列表中返回特定类型

c# - AnalysisContext.EnableConcurrentExecution() - 它到底做了什么?

c# - PRISM:区域未向 RegionManager 注册

c# - 使用 .net 学习多线程的好资源?

c# - 一个项目中的IdentityServer4和Web Api身份验证失败

C# MongoDB 驱动程序 [2.7.0] CountDocumentAsync 意外的 native 查询

c# - 在 C# 中将注册表项导出到 .REG 文件

c# - SyntaxWalker 不访问琐事

c# - 解决 NuGet 版本冲突

c# - 您将如何从现有的面向对象的 API 创建控制台应用程序?