예제 #1
0
            public static void Free(UseExceptionFilterWalker walker)
            {
                walker.CanUseExceptionFilter = true;
                walker.SemanticModel         = null;
                walker.CancellationToken     = default;

                _cachedInstance = walker;
            }
예제 #2
0
        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);
            }
        }
예제 #3
0
            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());
            }