Skip to content

Commit

Permalink
Do not suggest pattern matching in expression tree (fix #901) (RCS1248)
Browse files Browse the repository at this point in the history
  • Loading branch information
josefpihrt committed May 25, 2022
1 parent 1545a7d commit 54c9b66
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 21 deletions.
45 changes: 24 additions & 21 deletions src/Analyzers/CSharp/Analysis/NormalizeNullCheckAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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);
}
}
}
27 changes: 27 additions & 0 deletions src/Tests/Analyzers.Tests/RCS1248NormalizeNullCheckTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<C>);
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));
}
}
}

0 comments on commit 54c9b66

Please sign in to comment.