From 32646fb805f7c19d3096b998342c120b34fa7fdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Hellander?= Date: Wed, 20 Dec 2023 21:16:43 +0100 Subject: [PATCH] Fix SA1131 to not treat "complex" expressions as a literal #3759 --- .../ReadabilityRules/SA1131UnitTests.cs | 24 +++++++++++++++++++ .../SA1131UseReadableConditions.cs | 6 ++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/StyleCop.Analyzers/StyleCop.Analyzers.Test/ReadabilityRules/SA1131UnitTests.cs b/StyleCop.Analyzers/StyleCop.Analyzers.Test/ReadabilityRules/SA1131UnitTests.cs index 1ccd8509a..d93691edb 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers.Test/ReadabilityRules/SA1131UnitTests.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers.Test/ReadabilityRules/SA1131UnitTests.cs @@ -584,5 +584,29 @@ private void Method2() await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false); } } + + [Theory] + [InlineData("==")] + [InlineData("!=")] + [InlineData(">=")] + [InlineData("<=")] + [InlineData(">")] + [InlineData("<")] + [WorkItem(3759, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3759")] + public async Task TestComplexLeftHandSideExpressionAsync(string @operator) + { + var testCode = $@" +using System; +public class TypeName +{{ + public void Test(int x, int y, Func a) + {{ + var r1 = x + 1 {@operator} y; + var r2 = -x {@operator} y; + var r3 = a() {@operator} y; + }} +}}"; + await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false); + } } } diff --git a/StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1131UseReadableConditions.cs b/StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1131UseReadableConditions.cs index e3af5070e..204ffe3cf 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1131UseReadableConditions.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1131UseReadableConditions.cs @@ -86,7 +86,11 @@ private static bool IsLiteral(ExpressionSyntax expression, SemanticModel semanti switch (symbol) { case IFieldSymbol fieldSymbol when fieldSymbol.IsStatic && fieldSymbol.IsReadOnly: - case IMethodSymbol: + return true; + + // NOTE: Without the when clause, this would also treat e.g unary or binary expressions as literals, + // since GetSymbolInfo returns the operator method in those cases. + case IMethodSymbol when expression is IdentifierNameSyntax: return true; default: