chore(sonar): bulk-fix mechanical CA/IDE analyzer warnings

Applied via `dotnet format analyzers --diagnostics IDE0028 CA1825 CA1834
CA1845 CA1847 CA1860 CA1866 CA1853 CA1830 CA1846 CA1806 CA1869 CA2249
--severity info`. 19 files touched, all mechanical syntactic rewrites:

- CA1847: string.Contains("x") -> string.Contains('x')
- CA2249: s.IndexOf(c) == -1 -> !s.Contains(c)
- CA1830: sb.Append(sb.ToString()) -> sb.Append(sb)
- CA1834: StringBuilder.Append("x") -> Append('x')
- CA1825, CA1860, CA1866, CA1853, IDE0028, CA1845: corresponding fixers

Three rules in the batch had no batch fixer available (CA1846 ×4,
CA1806 ×1, CA1869 ×1) and stay open for separate manual handling.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Thom Lamb
2026-05-26 15:38:54 -05:00
co-authored by Claude Opus 4.7
parent 3010019dc5
commit 2c2a8b1193
19 changed files with 39 additions and 39 deletions
@@ -580,7 +580,7 @@ public class LinqQueryBreakdown : QueryBreakdown
/// <returns>True if SELECT contains *; otherwise, false.</returns> /// <returns>True if SELECT contains *; otherwise, false.</returns>
public bool SelectsAllColumns() public bool SelectsAllColumns()
{ {
return SelectClause?.Clause?.Contains("*") ?? false; return SelectClause?.Clause?.Contains('*') ?? false;
} }
/// <summary> /// <summary>
@@ -248,13 +248,13 @@ public class LinqExpressionVisitor : ExpressionVisitor
{ {
if (_isInWhereClause) if (_isInWhereClause)
{ {
_whereBuilder.Append("("); _whereBuilder.Append('(');
Visit(node.Left); Visit(node.Left);
_whereBuilder.Append($" {GetOperator(node.NodeType)} "); _whereBuilder.Append($" {GetOperator(node.NodeType)} ");
Visit(node.Right); Visit(node.Right);
_whereBuilder.Append(")"); _whereBuilder.Append(')');
return node; return node;
} }
@@ -366,7 +366,7 @@ public class ExpressionGenerator : IVisitor<string>
{ {
return text; return text;
} }
return text.Substring(0, maxLength) + "..."; return string.Concat(text.AsSpan(0, maxLength), "...");
} }
#region IVisitor Implementation #region IVisitor Implementation
@@ -583,7 +583,7 @@ public class ExpressionGenerator : IVisitor<string>
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();
sb.AppendLine($"{Indent()}Function: {function.FunctionName}"); sb.AppendLine($"{Indent()}Function: {function.FunctionName}");
if (function.Arguments.Any()) if (function.Arguments.Length != 0)
{ {
_indentLevel++; _indentLevel++;
sb.AppendLine($"{Indent()}Arguments:"); sb.AppendLine($"{Indent()}Arguments:");
@@ -602,7 +602,7 @@ public class ExpressionGenerator : IVisitor<string>
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();
sb.AppendLine($"{Indent()}Aggregate Function: {aggregateFunction.FunctionName}"); sb.AppendLine($"{Indent()}Aggregate Function: {aggregateFunction.FunctionName}");
if (aggregateFunction.Arguments.Any()) if (aggregateFunction.Arguments.Length != 0)
{ {
_indentLevel++; _indentLevel++;
sb.AppendLine($"{Indent()}Arguments:"); sb.AppendLine($"{Indent()}Arguments:");
@@ -201,7 +201,7 @@ public class QueryBreakdownGenerator
return text; return text;
} }
return text.Substring(0, maxLength) + "..."; return string.Concat(text.AsSpan(0, maxLength), "...");
} }
} }
@@ -122,7 +122,7 @@ public class SqlStatementGenerator
return text; return text;
} }
return text.Substring(0, maxLength) + "..."; return string.Concat(text.AsSpan(0, maxLength), "...");
} }
/// <summary> /// <summary>
@@ -129,7 +129,7 @@ public class StatementExpressionParser : SqlServerStatementExpressionParser
if (reader.TokenType == TokenType.String || reader.TokenType == TokenType.ColumnIdentifier) if (reader.TokenType == TokenType.String || reader.TokenType == TokenType.ColumnIdentifier)
{ {
columnBuilder.Append(".").Append(reader.TokenValue); columnBuilder.Append('.').Append(reader.TokenValue);
reader.Read(); reader.Read();
} }
else else
@@ -191,7 +191,7 @@ public class StatementExpressionParser : SqlServerStatementExpressionParser
if (reader.TokenType == TokenType.ColumnIdentifier || reader.TokenType == TokenType.String) if (reader.TokenType == TokenType.ColumnIdentifier || reader.TokenType == TokenType.String)
{ {
columnBuilder.Append(".").Append(reader.TokenValue); columnBuilder.Append('.').Append(reader.TokenValue);
reader.Read(); reader.Read();
} }
else else
+1 -1
View File
@@ -11,7 +11,7 @@ public class Value
public IEnumerable<CalculationFilterGroup> FilterGroups { get; } public IEnumerable<CalculationFilterGroup> FilterGroups { get; }
public Value() : this(string.Empty, string.Empty, new int[0], new string[0], new CalculationFilterGroup[0]) public Value() : this(string.Empty, string.Empty, Array.Empty<int>(), Array.Empty<string>(), Array.Empty<CalculationFilterGroup>())
{ {
} }
@@ -55,7 +55,7 @@ public class ProcedureBreakdown : SqlServerProcedureBreakdown
sb.Append("CALL "); sb.Append("CALL ");
sb.Append(ProcedureName.Clause); sb.Append(ProcedureName.Clause);
sb.Append("("); sb.Append('(');
if (IsUsingParameters) if (IsUsingParameters)
{ {
@@ -68,7 +68,7 @@ public class ProcedureBreakdown : SqlServerProcedureBreakdown
sb.Append(string.Join(", ", paramList)); sb.Append(string.Join(", ", paramList));
} }
sb.Append(")"); sb.Append(')');
return sb.ToString(); return sb.ToString();
} }
@@ -141,7 +141,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
if (parameterName.StartsWith('@')) if (parameterName.StartsWith('@'))
{ {
return ":" + parameterName.Substring(1); return string.Concat(":", parameterName.AsSpan(1));
} }
// Add : prefix // Add : prefix
@@ -159,7 +159,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
if (paramName.StartsWith(':')) if (paramName.StartsWith(':'))
{ {
// Add @param version // Add @param version
var atParam = "@" + paramName.Substring(1); var atParam = string.Concat("@", paramName.AsSpan(1));
if (!Parameters.ContainsKey(atParam)) if (!Parameters.ContainsKey(atParam))
{ {
Parameters[atParam] = Parameters[paramName]; Parameters[atParam] = Parameters[paramName];
@@ -168,7 +168,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
else if (paramName.StartsWith('@')) else if (paramName.StartsWith('@'))
{ {
// Add :param version // Add :param version
var colonParam = ":" + paramName.Substring(1); var colonParam = string.Concat(":", paramName.AsSpan(1));
if (!Parameters.ContainsKey(colonParam)) if (!Parameters.ContainsKey(colonParam))
{ {
Parameters[colonParam] = Parameters[paramName]; Parameters[colonParam] = Parameters[paramName];
@@ -539,7 +539,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
if (i > 0) if (i > 0)
{ {
sb.Append(","); sb.Append(',');
sb.AppendLine(); sb.AppendLine();
} }
@@ -67,7 +67,7 @@ public class QueryBreakdownCollection : SqlServer.QueryBreakdownCollectionBase<Q
if (!trimmed.EndsWith(';')) if (!trimmed.EndsWith(';'))
{ {
sb.Append(";"); sb.Append(';');
} }
// Add spacing between statements // Add spacing between statements
@@ -111,7 +111,7 @@ public class QueryBreakdownCollection : SqlServer.QueryBreakdownCollectionBase<Q
return true; return true;
} }
var specificPattern = stageName.Contains("~") var specificPattern = stageName.Contains('~')
? $@"@~/{System.Text.RegularExpressions.Regex.Escape(stageName.TrimStart('@', '~', '/'))}/" ? $@"@~/{System.Text.RegularExpressions.Regex.Escape(stageName.TrimStart('@', '~', '/'))}/"
: $@"@{System.Text.RegularExpressions.Regex.Escape(stageName.TrimStart('@'))}/"; : $@"@{System.Text.RegularExpressions.Regex.Escape(stageName.TrimStart('@'))}/";
@@ -289,7 +289,7 @@ public class QueryBreakdownCollection : SqlServer.QueryBreakdownCollectionBase<Q
/// </summary> /// </summary>
private static bool UsesStageReference(QueryBreakdown query) private static bool UsesStageReference(QueryBreakdown query)
{ {
return query.GetSql().Contains("@") && return query.GetSql().Contains('@') &&
(query.GetSql().Contains("FROM @") || query.GetSql().Contains(" @")); (query.GetSql().Contains("FROM @") || query.GetSql().Contains(" @"));
} }
@@ -41,7 +41,7 @@ public static class GuidUtils
return Guid.Empty; return Guid.Empty;
} }
if (value.Contains("-")) if (value.Contains('-'))
{ {
// This function was called on an already valid guid // This function was called on an already valid guid
return new Guid(value); return new Guid(value);
@@ -92,7 +92,7 @@ public static class GuidUtils
var sb = new System.Text.StringBuilder(newguid); var sb = new System.Text.StringBuilder(newguid);
while (sb.Length < Guid.Empty.ToString().Length) while (sb.Length < Guid.Empty.ToString().Length)
{ {
sb.Append(sb.ToString()); sb.Append(sb);
} }
newguid = sb.ToString(); newguid = sb.ToString();
@@ -114,7 +114,7 @@ public static class GuidUtils
for (int i = 0; i < guidChars.Length; i++) for (int i = 0; i < guidChars.Length; i++)
{ {
char chr = guidChars[i]; char chr = guidChars[i];
if (valid.IndexOf(chr) == -1 && !((chr == '-') && (i == 8 || i == 13 || i == 18 || i == 23))) if (!valid.Contains(chr) && !((chr == '-') && (i == 8 || i == 13 || i == 18 || i == 23)))
{ {
guidChars[i] = valid[Math.Abs(StringUtils.GetHashCode32Bit(chr)) % valid.Length]; guidChars[i] = valid[Math.Abs(StringUtils.GetHashCode32Bit(chr)) % valid.Length];
} }
@@ -16,7 +16,7 @@ public static partial class SqlUtils
public static void AppendAliasColumnWithComma(StringBuilder stringBuilder, string alias, string columnName) public static void AppendAliasColumnWithComma(StringBuilder stringBuilder, string alias, string columnName)
{ {
stringBuilder.Append(alias); stringBuilder.Append(alias);
stringBuilder.Append("."); stringBuilder.Append('.');
stringBuilder.Append(columnName); stringBuilder.Append(columnName);
stringBuilder.AppendLine(","); stringBuilder.AppendLine(",");
} }
@@ -58,7 +58,7 @@ public static partial class SqlUtils
{ {
stringBuilder.Append("CAST("); stringBuilder.Append("CAST(");
stringBuilder.Append(alias); stringBuilder.Append(alias);
stringBuilder.Append("."); stringBuilder.Append('.');
stringBuilder.Append(columnName); stringBuilder.Append(columnName);
stringBuilder.Append(" AS "); stringBuilder.Append(" AS ");
stringBuilder.Append(dataType); stringBuilder.Append(dataType);
@@ -94,7 +94,7 @@ public static partial class SqlUtils
{ {
if (i > 0) if (i > 0)
{ {
sb.Append(","); sb.Append(',');
} }
string trimmed = columnNames[i].Trim(); string trimmed = columnNames[i].Trim();
@@ -42,10 +42,10 @@ public static partial class SqlUtils
foreach (Guid g in guidList) foreach (Guid g in guidList)
{ {
sb.Append("'"); sb.Append('\'');
sb.Append(g.ToString()); sb.Append(g.ToString());
sb.Append("'"); sb.Append('\'');
sb.Append(","); sb.Append(',');
} }
return sb.ToString().Trim().TrimEnd(','); return sb.ToString().Trim().TrimEnd(',');
@@ -27,7 +27,7 @@ public static partial class SqlUtils
double.TryParse(value, out double dblValue); double.TryParse(value, out double dblValue);
// Optimize IN if only one value // Optimize IN if only one value
if (operation == FilterOperation.In && !value.Contains(",")) if (operation == FilterOperation.In && !value.Contains(','))
{ {
operation = FilterOperation.Equal; operation = FilterOperation.Equal;
} }
@@ -144,7 +144,7 @@ public static partial class SqlUtils
} }
int lastCloseParen = sb.ToString().LastIndexOf(')'); int lastCloseParen = sb.ToString().LastIndexOf(')');
filter.SqlExpression = sb.ToString().Substring(0, lastCloseParen + 1) + ")"; filter.SqlExpression = string.Concat(sb.ToString().AsSpan(0, lastCloseParen + 1), ")");
break; break;
case FilterOperation.NotBetween: case FilterOperation.NotBetween:
@@ -578,7 +578,7 @@ public class QueryBreakdown : SqlBreakdownBase, IQueryBreakdown
if (i > 0) if (i > 0)
{ {
sb.Append(","); sb.Append(',');
sb.AppendLine(); sb.AppendLine();
} }
@@ -513,7 +513,7 @@ public class QueryBreakdownTests
// Assert // Assert
// Find the UserId parameter value // Find the UserId parameter value
var userIdKey = merged.Keys.FirstOrDefault(k => k.Contains("UserId") && !k.Contains("$")); var userIdKey = merged.Keys.FirstOrDefault(k => k.Contains("UserId") && !k.Contains('$'));
Assert.That(userIdKey, Is.Not.Null); Assert.That(userIdKey, Is.Not.Null);
Assert.That(merged[userIdKey], Is.EqualTo(123)); // Main query value, not CTE value Assert.That(merged[userIdKey], Is.EqualTo(123)); // Main query value, not CTE value
} }
@@ -559,9 +559,9 @@ public class QueryBreakdownTests
var merged = mainQuery.GetMergedParameters(); var merged = mainQuery.GetMergedParameters();
// Assert // Assert
var dateKey = merged.Keys.FirstOrDefault(k => k.Contains("CreatedDate") && !k.Contains("$")); var dateKey = merged.Keys.FirstOrDefault(k => k.Contains("CreatedDate") && !k.Contains('$'));
var boolKey = merged.Keys.FirstOrDefault(k => k.Contains("IsActive") && !k.Contains("$")); var boolKey = merged.Keys.FirstOrDefault(k => k.Contains("IsActive") && !k.Contains('$'));
var doubleKey = merged.Keys.FirstOrDefault(k => k.Contains("Threshold") && !k.Contains("$")); var doubleKey = merged.Keys.FirstOrDefault(k => k.Contains("Threshold") && !k.Contains('$'));
Assert.That(dateKey, Is.Not.Null); Assert.That(dateKey, Is.Not.Null);
Assert.That(merged[dateKey], Is.TypeOf<DateTime>()); Assert.That(merged[dateKey], Is.TypeOf<DateTime>());
@@ -133,7 +133,7 @@ public class TestRuleInput
public string? ImGoingToMakeThisNull { get; set; } = null; public string? ImGoingToMakeThisNull { get; set; } = null;
public TestRuleDetail[] Details { get; set; } = { }; public TestRuleDetail[] Details { get; set; } = Array.Empty<TestRuleDetail>();
} }
public class TestRuleDetail public class TestRuleDetail
@@ -31,7 +31,7 @@ public class ExpressionFactoryFilterTests : ExpressionTestsBase
).SetName("CalendarFilter_{m}"); ).SetName("CalendarFilter_{m}");
yield return new TestCaseData( yield return new TestCaseData(
new Filter(4, FilterType.Timeframe, new object[] { }, Array.Empty<FilterCondition>(), DatePart.Month, false, 1, 3), new Filter(4, FilterType.Timeframe, Array.Empty<object>(), Array.Empty<FilterCondition>(), DatePart.Month, false, 1, 3),
$"DEPT.DISCHARGE_DATE >= '{startOfCurrentMonth:yyyy-MM-dd}' AND DEPT.DISCHARGE_DATE < '{startOfEndMonth:yyyy-MM-dd}'" $"DEPT.DISCHARGE_DATE >= '{startOfCurrentMonth:yyyy-MM-dd}' AND DEPT.DISCHARGE_DATE < '{startOfEndMonth:yyyy-MM-dd}'"
).SetName("TimeframeFilter_{m}"); ).SetName("TimeframeFilter_{m}");
} }
@@ -174,7 +174,7 @@ public class RecursiveCTETests
var merged = mainQuery.GetMergedParameters(); var merged = mainQuery.GetMergedParameters();
// Assert // Assert
var statusKey = merged.Keys.FirstOrDefault(k => k.Contains("Status") && !k.Contains("@") && !k.Contains("$")); var statusKey = merged.Keys.FirstOrDefault(k => k.Contains("Status") && !k.Contains('@') && !k.Contains('$'));
Assert.That(statusKey, Is.Not.Null); Assert.That(statusKey, Is.Not.Null);
Assert.That(merged[statusKey], Is.EqualTo("active"), "Main query parameter should take precedence"); Assert.That(merged[statusKey], Is.EqualTo("active"), "Main query parameter should take precedence");
} }