private bool IsNonNullCheck()

in src/Microsoft.VisualStudio.SDK.Analyzers/VSSDK006CheckServicesExistAnalyzer.cs [199:229]


            private bool IsNonNullCheck(SyntaxNode node, ISymbol symbol, SyntaxNodeAnalysisContext context)
            {
                bool IsSymbol(SyntaxNode n) => SymbolEqualityComparer.Default.Equals(symbol, context.Compilation.GetSemanticModel(n.SyntaxTree).GetSymbolInfo(n, context.CancellationToken).Symbol);
                bool IsEqualsOrExclamationEqualsCheck(BinaryExpressionSyntax o) => (o.OperatorToken.IsKind(SyntaxKind.EqualsEqualsToken) || o.OperatorToken.IsKind(SyntaxKind.ExclamationEqualsToken))
                                                                                    && (o.Left.IsKind(SyntaxKind.NullLiteralExpression) || o.Right.IsKind(SyntaxKind.NullLiteralExpression))
                                                                                    && (IsSymbol(o.Left) || IsSymbol(o.Right));
                bool IsPatternMatchTypeCheck(BinaryExpressionSyntax o) => o.OperatorToken.IsKind(SyntaxKind.IsKeyword)
                                                                          && (o.Right.IsKind(SyntaxKind.IdentifierName) || o.Right.IsKind(SyntaxKind.PredefinedType))
                                                                          && IsSymbol(o.Left);
                bool IsPatternMatchNullCheck(IsPatternExpressionSyntax o) => o.Pattern is ConstantPatternSyntax pattern
                                                                             && pattern.Expression.IsKind(SyntaxKind.NullLiteralExpression)
                                                                             && IsSymbol(o.Expression);

                if (node is IfStatementSyntax ifStatement)
                {
                    if (ifStatement.Condition.DescendantNodesAndSelf().OfType<BinaryExpressionSyntax>().Any(
                          o => IsEqualsOrExclamationEqualsCheck(o) || IsPatternMatchTypeCheck(o))
                        || ifStatement.Condition.DescendantNodesAndSelf().OfType<IsPatternExpressionSyntax>().Any(
                          o => IsPatternMatchNullCheck(o)))
                    {
                        return true;
                    }
                }

                if (this.IsThrowingNullCheck(node, symbol, context))
                {
                    return true;
                }

                return false;
            }