public static void Free(UseExceptionFilterWalker walker) { walker.CanUseExceptionFilter = true; walker.SemanticModel = null; walker.CancellationToken = default; _cachedInstance = walker; }
private static void AnalyzeCatchClause(SyntaxNodeAnalysisContext context) { var catchClause = (CatchClauseSyntax)context.Node; if (catchClause.Filter != null) { return; } if (!(catchClause.Block.Statements.FirstOrDefault() is IfStatementSyntax ifStatement)) { return; } if (IsThrowStatementWithoutExpression(ifStatement.Statement.SingleNonBlockStatementOrDefault()) ^ IsThrowStatementWithoutExpression(ifStatement.Else?.Statement.SingleNonBlockStatementOrDefault())) { bool canUseExceptionFilter; UseExceptionFilterWalker walker = null; try { walker = UseExceptionFilterWalker.GetInstance(); walker.SemanticModel = context.SemanticModel; walker.CancellationToken = context.CancellationToken; walker.Visit(ifStatement.Condition); canUseExceptionFilter = walker.CanUseExceptionFilter; } finally { if (walker != null) { UseExceptionFilterWalker.Free(walker); } } if (!canUseExceptionFilter) { return; } if (ifStatement.ContainsUnbalancedIfElseDirectives()) { return; } DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.UseExceptionFilter, ifStatement.IfKeyword); } }
public static UseExceptionFilterWalker GetInstance() { UseExceptionFilterWalker walker = _cachedInstance; if (walker != null) { Debug.Assert(walker.CanUseExceptionFilter = true); Debug.Assert(walker.SemanticModel == null); Debug.Assert(walker.CancellationToken == default); _cachedInstance = null; return(walker); } return(new UseExceptionFilterWalker()); }