如何使用 Roslyn Analyzer 检测特定方法是否不包含 try catch 块?
How can i detect if a specific method does not contain try catch block using Roslyn Analyzer?
我想分析类似
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() 方法,这样它应该只扫描 MethodDeclaration。
注意:注释行应忽略。
提前致谢。
你需要分析方法,而不是单独的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);
}
我想分析类似
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() 方法,这样它应该只扫描 MethodDeclaration。
注意:注释行应忽略。
提前致谢。
你需要分析方法,而不是单独的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);
}