How can i detect if a specific method does not contain try catch block using Roslyn Analyzer?

Viewed 295

I want to analyze something like

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

In Roslyn Analyzer project i have something like below:

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
}

So depending on flag i can determine if try catch exist or not.

I want to find 'try' and 'catch' statement present in GetDetails() method by writing code in AnalyzeCode() method such that it should only scan the MethodDeclaration.

Note: Commented lines should be ignored.

Thanks in advance.

1 Answers

You need to analyse the method, not the individual try statements. Also, I prefer to extract the lambda into its own method, so it would look something like this:

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);
}
Related