【问题标题】:How can i detect if a specific method does not contain try catch block using Roslyn Analyzer?如何使用 Roslyn Analyzer 检测特定方法是否不包含 try catch 块?
【发布时间】:2020-05-15 08:45:09
【问题描述】:

我想分析类似的东西

public void GetDetails()
{
   try
   {
       //some code
   }
   catch()
   {
       //some code
   }
}

在 Roslyn Analyzer 项目中,我有如下内容:

public override void Initialize(AnalysisContext context)
{
      context.RegisterSyntaxNodeAction(AnalyzeCode, SyntaxKind.MethodDeclaration);
}

private void AnalyzeCode(SyntaxNodeAnalysisContext context)
{
     //I want here something like below
     context.RegisterSyntaxNodeAction(ctx =>
     {
           //set some flag
     }, SyntaxKind.TryStatement);

     //similar for catch block
}

所以根据标志我可以确定 try catch 是否存在。

我想通过在 AnalyzeCode() 方法中编写代码来查找 GetDetails() 方法中存在的 'try' 和 'catch' 语句,这样它应该只扫描方法声明。

注意:注释行应被忽略。

提前致谢。

【问题讨论】:

    标签: c# visual-studio roslyn roslyn-code-analysis


    【解决方案1】:

    您需要分析方法,而不是单独的 try 语句。另外,我更喜欢将 lambda 提取到它自己的方法中,所以它看起来像这样:

    public override void Initialize(AnalysisContext context)
    {
        context.RegisterSyntaxNodeAction(
            AnalyzeMethodForMissingTryBlock, SyntaxKind.MethodDeclaration);
    }
    
    private void AnalyzeMethodForMissingTryBlock(SyntaxNodeAnalysisContext context)
    {
        // Search all descendants for a try statement
        if (context.Node.DescendantNodes().Any(n => n.Kind() == SyntaxKind.TryStatement))
        {
            return;
        }
    
        // Try block was not found, so we report a diagnostic
        var method = (MethodDeclarationSyntax)context.Node;
        var diagnostic = Diagnostic.Create(
            Rule, 
            context.Node.GetLocation(), 
            method.Identifier.Text);
    
        context.ReportDiagnostic(diagnostic);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多