From 54c9b6613e48b61285a5b24e6e4d43b32e7eb031 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Wed, 25 May 2022 16:38:46 +0200 Subject: [PATCH] Do not suggest pattern matching in expression tree (fix #901) (RCS1248) --- .../Analysis/NormalizeNullCheckAnalyzer.cs | 45 ++++++++++--------- .../RCS1248NormalizeNullCheckTests.cs | 27 +++++++++++ 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/Analyzers/CSharp/Analysis/NormalizeNullCheckAnalyzer.cs b/src/Analyzers/CSharp/Analysis/NormalizeNullCheckAnalyzer.cs index 84715366e7..01875c2128 100644 --- a/src/Analyzers/CSharp/Analysis/NormalizeNullCheckAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/NormalizeNullCheckAnalyzer.cs @@ -70,14 +70,13 @@ private static void AnalyzeEqualsExpression(SyntaxNodeAnalysisContext context) NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(binaryExpression, allowedStyles: NullCheckStyles.EqualsToNull, walkDownParentheses: false); - if (nullCheck.Success) - { - DiagnosticHelpers.ReportDiagnostic( - context, - DiagnosticRules.NormalizeNullCheck, - binaryExpression, - "pattern matching"); - } + if (!nullCheck.Success) + return; + + if (binaryExpression.IsInExpressionTree(context.SemanticModel, context.CancellationToken)) + return; + + ReportDiagnostic(context, binaryExpression, "pattern matching"); } private static void AnalyzeNotEqualsExpression(SyntaxNodeAnalysisContext context) @@ -89,14 +88,13 @@ private static void AnalyzeNotEqualsExpression(SyntaxNodeAnalysisContext context NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(binaryExpression, allowedStyles: NullCheckStyles.NotEqualsToNull); - if (nullCheck.Success) - { - DiagnosticHelpers.ReportDiagnostic( - context, - DiagnosticRules.NormalizeNullCheck, - binaryExpression, - "pattern matching"); - } + if (!nullCheck.Success) + return; + + if (binaryExpression.IsInExpressionTree(context.SemanticModel, context.CancellationToken)) + return; + + ReportDiagnostic(context, binaryExpression, "pattern matching"); } private static void AnalyzeIsPatternExpression(SyntaxNodeAnalysisContext context) @@ -109,12 +107,17 @@ private static void AnalyzeIsPatternExpression(SyntaxNodeAnalysisContext context if (isPatternExpression.Pattern is ConstantPatternSyntax constantPattern && constantPattern.Expression.IsKind(SyntaxKind.NullLiteralExpression)) { - DiagnosticHelpers.ReportDiagnostic( - context, - DiagnosticRules.NormalizeNullCheck, - isPatternExpression, - "equality operator"); + ReportDiagnostic(context, isPatternExpression, "equality operator"); } } + + private static void ReportDiagnostic(SyntaxNodeAnalysisContext context, ExpressionSyntax expression, string messageArg) + { + DiagnosticHelpers.ReportDiagnostic( + context, + DiagnosticRules.NormalizeNullCheck, + expression, + messageArg); + } } } diff --git a/src/Tests/Analyzers.Tests/RCS1248NormalizeNullCheckTests.cs b/src/Tests/Analyzers.Tests/RCS1248NormalizeNullCheckTests.cs index 4d08a1a4c8..f1df7c3a21 100644 --- a/src/Tests/Analyzers.Tests/RCS1248NormalizeNullCheckTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1248NormalizeNullCheckTests.cs @@ -184,5 +184,32 @@ void M() ", options: WellKnownCSharpTestOptions.Default_CSharp8 .AddConfigOption(ConfigOptionKeys.NullCheckStyle, ConfigOptionValues.NullCheckStyle_PatternMatching)); } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.NormalizeNullCheck)] + public async Task TestNoDiagnostic_ExpressionTree() + { + await VerifyNoDiagnosticAsync(@" +using System.Collections.Generic; +using System.Linq; + +class C +{ + void M() + { + var items = default(IQueryable); + + var items2 = items + .Where(f => f.P == null) + .ToList(); + + var items3 = items + .Where(f => f.P != null) + .ToList(); + } + + public object P { get; } +} +", options: Options.AddConfigOption(ConfigOptionKeys.NullCheckStyle, ConfigOptionValues.NullCheckStyle_PatternMatching)); + } } }