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: