Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix S3267 FN: Support list pattern #6414

Merged
merged 9 commits into from
Dec 6, 2022
19 changes: 12 additions & 7 deletions analyzers/src/SonarAnalyzer.CSharp/Rules/LoopsAndLinq.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,17 @@ node switch
_ => null
};

private static bool CanIfStatementBeMoved(IfStatementSyntax ifStatementSyntax) =>
ifStatementSyntax.Else == null
&& ifStatementSyntax.Condition is InvocationExpressionSyntax invocationExpressionSyntax
&& !invocationExpressionSyntax.DescendantNodes()
.OfType<ArgumentSyntax>()
.Any(argument => argument.RefOrOutKeyword.IsAnyKind(SyntaxKind.OutKeyword, SyntaxKind.RefKeyword));
private static bool CanIfStatementBeMoved(IfStatementSyntax ifStatementSyntax)
{
return ifStatementSyntax.Else == null && (ConditionIsPattern() || ConditionValidInvocation());

bool ConditionIsPattern() => IsPatternExpressionSyntaxWrapper.IsInstance(ifStatementSyntax.Condition);

bool ConditionValidInvocation() => ifStatementSyntax.Condition is InvocationExpressionSyntax invocationExpressionSyntax
&& !invocationExpressionSyntax.DescendantNodes()
.OfType<ArgumentSyntax>()
cristian-ambrosini-sonarsource marked this conversation as resolved.
Show resolved Hide resolved
.Any(argument => argument.RefOrOutKeyword.IsAnyKind(SyntaxKind.OutKeyword, SyntaxKind.RefKeyword));
}

cristian-ambrosini-sonarsource marked this conversation as resolved.
Show resolved Hide resolved
/// <remarks>
/// There are multiple scenarios where the code can be simplified using LINQ.
Expand Down Expand Up @@ -135,7 +140,7 @@ private static void CheckIfCanBeSimplifiedUsingSelect(ForEachStatementSyntax for
!(memberAccess.Parent is AssignmentExpressionSyntax assignment && assignment.Left == memberAccess);
}

private class UsageStats
private sealed class UsageStats
{
public int Count { get; set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ class MyClass
{
void ListPattern(List<int[]> list)
{
foreach (int[] array in list) // FN
foreach (int[] array in list) // Noncompliant
{
if (array is [1, 2, 3]) // FN
if (array is [1, 2, 3]) // Secondary
{
Console.WriteLine("Test");
Console.WriteLine("Pattern match successful");
}
}
}
}
}

csaba-sagi-sonarsource marked this conversation as resolved.
Show resolved Hide resolved
11 changes: 11 additions & 0 deletions analyzers/tests/SonarAnalyzer.UnitTest/TestCases/LoopsAndLinq.cs
Original file line number Diff line number Diff line change
Expand Up @@ -309,5 +309,16 @@ public class Point

public int GetX() => X;
}

void IsPattern(List<int> list)
{
foreach (var item in list) // Noncompliant
{
if (item is 42) // Secondary
{
Console.WriteLine("The meaning of Life.");
}
}
}
}
}