Skip to content

Commit 54c9b66

Browse files
committed
Do not suggest pattern matching in expression tree (fix #901) (RCS1248)
1 parent 1545a7d commit 54c9b66

File tree

2 files changed

+51
-21
lines changed

2 files changed

+51
-21
lines changed

src/Analyzers/CSharp/Analysis/NormalizeNullCheckAnalyzer.cs

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,13 @@ private static void AnalyzeEqualsExpression(SyntaxNodeAnalysisContext context)
7070

7171
NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(binaryExpression, allowedStyles: NullCheckStyles.EqualsToNull, walkDownParentheses: false);
7272

73-
if (nullCheck.Success)
74-
{
75-
DiagnosticHelpers.ReportDiagnostic(
76-
context,
77-
DiagnosticRules.NormalizeNullCheck,
78-
binaryExpression,
79-
"pattern matching");
80-
}
73+
if (!nullCheck.Success)
74+
return;
75+
76+
if (binaryExpression.IsInExpressionTree(context.SemanticModel, context.CancellationToken))
77+
return;
78+
79+
ReportDiagnostic(context, binaryExpression, "pattern matching");
8180
}
8281

8382
private static void AnalyzeNotEqualsExpression(SyntaxNodeAnalysisContext context)
@@ -89,14 +88,13 @@ private static void AnalyzeNotEqualsExpression(SyntaxNodeAnalysisContext context
8988

9089
NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(binaryExpression, allowedStyles: NullCheckStyles.NotEqualsToNull);
9190

92-
if (nullCheck.Success)
93-
{
94-
DiagnosticHelpers.ReportDiagnostic(
95-
context,
96-
DiagnosticRules.NormalizeNullCheck,
97-
binaryExpression,
98-
"pattern matching");
99-
}
91+
if (!nullCheck.Success)
92+
return;
93+
94+
if (binaryExpression.IsInExpressionTree(context.SemanticModel, context.CancellationToken))
95+
return;
96+
97+
ReportDiagnostic(context, binaryExpression, "pattern matching");
10098
}
10199

102100
private static void AnalyzeIsPatternExpression(SyntaxNodeAnalysisContext context)
@@ -109,12 +107,17 @@ private static void AnalyzeIsPatternExpression(SyntaxNodeAnalysisContext context
109107
if (isPatternExpression.Pattern is ConstantPatternSyntax constantPattern
110108
&& constantPattern.Expression.IsKind(SyntaxKind.NullLiteralExpression))
111109
{
112-
DiagnosticHelpers.ReportDiagnostic(
113-
context,
114-
DiagnosticRules.NormalizeNullCheck,
115-
isPatternExpression,
116-
"equality operator");
110+
ReportDiagnostic(context, isPatternExpression, "equality operator");
117111
}
118112
}
113+
114+
private static void ReportDiagnostic(SyntaxNodeAnalysisContext context, ExpressionSyntax expression, string messageArg)
115+
{
116+
DiagnosticHelpers.ReportDiagnostic(
117+
context,
118+
DiagnosticRules.NormalizeNullCheck,
119+
expression,
120+
messageArg);
121+
}
119122
}
120123
}

src/Tests/Analyzers.Tests/RCS1248NormalizeNullCheckTests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,5 +184,32 @@ void M()
184184
", options: WellKnownCSharpTestOptions.Default_CSharp8
185185
.AddConfigOption(ConfigOptionKeys.NullCheckStyle, ConfigOptionValues.NullCheckStyle_PatternMatching));
186186
}
187+
188+
[Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.NormalizeNullCheck)]
189+
public async Task TestNoDiagnostic_ExpressionTree()
190+
{
191+
await VerifyNoDiagnosticAsync(@"
192+
using System.Collections.Generic;
193+
using System.Linq;
194+
195+
class C
196+
{
197+
void M()
198+
{
199+
var items = default(IQueryable<C>);
200+
201+
var items2 = items
202+
.Where(f => f.P == null)
203+
.ToList();
204+
205+
var items3 = items
206+
.Where(f => f.P != null)
207+
.ToList();
208+
}
209+
210+
public object P { get; }
211+
}
212+
", options: Options.AddConfigOption(ConfigOptionKeys.NullCheckStyle, ConfigOptionValues.NullCheckStyle_PatternMatching));
213+
}
187214
}
188215
}

0 commit comments

Comments
 (0)