Saya ingin menganalisis sesuatu seperti

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

Dalam proyek Roslyn Analyzer saya memiliki sesuatu seperti di bawah ini:

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
}

Jadi tergantung pada flag saya dapat menentukan apakah try catch ada atau tidak.

Saya ingin menemukan pernyataan 'coba' dan 'tangkap' yang ada dalam metode GetDetails() dengan menulis kode dalam metode AnalyzeCode() sehingga seharusnya hanya memindai MethodDeclaration.

Catatan: Baris yang dikomentari harus diabaikan.

Terima kasih sebelumnya.

2
EnigmaticJohn 15 Mei 2020, 11:45

1 menjawab

Jawaban Terbaik

Anda perlu menganalisis metodenya, bukan pernyataan percobaan individu. Juga, saya lebih suka mengekstrak lambda ke dalam metodenya sendiri, sehingga akan terlihat seperti ini:

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);
}
1
DavidG 15 Mei 2020, 11:38