Skip to content

Commit 49aff3a

Browse files
Refactor IndexOfSubstringAnalyzer for clarity and conciseness
Simplify logic by moving IndexOf call checks into if-conditions and reducing nested blocks. Streamline diagnostic reporting and invocation iteration for improved readability and maintainability without changing analyzer behavior.
1 parent db6a0c6 commit 49aff3a

1 file changed

Lines changed: 20 additions & 26 deletions

File tree

Analyzers/IndexOfSubstringAnalyzer.cs

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -50,39 +50,34 @@ private static void AnalyzeBlock(SyntaxNodeAnalysisContext context, SyntaxList<S
5050
{
5151
foreach (var variable in localDecl.Declaration.Variables)
5252
{
53-
if (variable.Initializer?.Value is InvocationExpressionSyntax indexOfCall)
53+
if (variable.Initializer?.Value is InvocationExpressionSyntax indexOfCall && IsIndexOfCall(indexOfCall, context))
5454
{
55-
if (IsIndexOfCall(indexOfCall, context))
55+
// Look ahead for Substring call using this variable
56+
var variableName = variable.Identifier.Text;
57+
if (FindSubstringUsage(statements.Skip(i + 1), variableName, out var substringLocation))
5658
{
57-
// Look ahead for Substring call using this variable
58-
var variableName = variable.Identifier.Text;
59-
if (FindSubstringUsage(statements.Skip(i + 1), variableName, out var substringLocation))
60-
{
61-
var diagnostic = Diagnostic.Create(
62-
DiagnosticDescriptors.UseSpanForIndexOfSubstring,
63-
substringLocation);
64-
context.ReportDiagnostic(diagnostic);
65-
}
59+
var diagnostic = Diagnostic.Create(
60+
DiagnosticDescriptors.UseSpanForIndexOfSubstring,
61+
substringLocation);
62+
context.ReportDiagnostic(diagnostic);
6663
}
6764
}
6865
}
6966
}
7067
// Look for assignment of IndexOf to existing variable
71-
else if (statements[i] is ExpressionStatementSyntax exprStmt &&
72-
exprStmt.Expression is AssignmentExpressionSyntax assignment &&
73-
assignment.Left is IdentifierNameSyntax identifier &&
74-
assignment.Right is InvocationExpressionSyntax indexOfCall)
68+
else if (statements[i] is ExpressionStatementSyntax exprStmt
69+
&& exprStmt.Expression is AssignmentExpressionSyntax assignment
70+
&& assignment.Left is IdentifierNameSyntax identifier
71+
&& assignment.Right is InvocationExpressionSyntax indexOfCall
72+
&& IsIndexOfCall(indexOfCall, context))
7573
{
76-
if (IsIndexOfCall(indexOfCall, context))
74+
var variableName = identifier.Identifier.Text;
75+
if (FindSubstringUsage(statements.Skip(i + 1), variableName, out var substringLocation))
7776
{
78-
var variableName = identifier.Identifier.Text;
79-
if (FindSubstringUsage(statements.Skip(i + 1), variableName, out var substringLocation))
80-
{
81-
var diagnostic = Diagnostic.Create(
82-
DiagnosticDescriptors.UseSpanForIndexOfSubstring,
83-
substringLocation);
84-
context.ReportDiagnostic(diagnostic);
85-
}
77+
var diagnostic = Diagnostic.Create(
78+
DiagnosticDescriptors.UseSpanForIndexOfSubstring,
79+
substringLocation);
80+
context.ReportDiagnostic(diagnostic);
8681
}
8782
}
8883
}
@@ -120,8 +115,7 @@ private static bool FindSubstringUsage(
120115

121116
foreach (var statement in statements)
122117
{
123-
var invocations = statement.DescendantNodes().OfType<InvocationExpressionSyntax>();
124-
foreach (var invocation in invocations)
118+
foreach (var invocation in statement.DescendantNodes().OfType<InvocationExpressionSyntax>())
125119
{
126120
if (invocation.Expression is MemberAccessExpressionSyntax memberAccess &&
127121
memberAccess.Name.Identifier.Text == "Substring")

0 commit comments

Comments
 (0)