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;
}