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>
public bool SelectsAllColumns()
{
return SelectClause?.Clause?.Contains("*") ?? false;
return SelectClause?.Clause?.Contains('*') ?? false;
}
/// <summary>
@@ -248,13 +248,13 @@ public class LinqExpressionVisitor : ExpressionVisitor
{
if (_isInWhereClause)
{
_whereBuilder.Append("(");
_whereBuilder.Append('(');
Visit(node.Left);
_whereBuilder.Append($" {GetOperator(node.NodeType)} ");
Visit(node.Right);
_whereBuilder.Append(")");
_whereBuilder.Append(')');
return node;
}
@@ -366,7 +366,7 @@ public class ExpressionGenerator : IVisitor<string>
{
return text;
}
return text.Substring(0, maxLength) + "...";
return string.Concat(text.AsSpan(0, maxLength), "...");
}
#region IVisitor Implementation
@@ -583,7 +583,7 @@ public class ExpressionGenerator : IVisitor<string>
{
var sb = new StringBuilder();
sb.AppendLine($"{Indent()}Function: {function.FunctionName}");
if (function.Arguments.Any())
if (function.Arguments.Length != 0)
{
_indentLevel++;
sb.AppendLine($"{Indent()}Arguments:");
@@ -602,7 +602,7 @@ public class ExpressionGenerator : IVisitor<string>
{
var sb = new StringBuilder();
sb.AppendLine($"{Indent()}Aggregate Function: {aggregateFunction.FunctionName}");
if (aggregateFunction.Arguments.Any())
if (aggregateFunction.Arguments.Length != 0)
{
_indentLevel++;
sb.AppendLine($"{Indent()}Arguments:");
@@ -201,7 +201,7 @@ public class QueryBreakdownGenerator
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.Substring(0, maxLength) + "...";
return string.Concat(text.AsSpan(0, maxLength), "...");
}
/// <summary>
@@ -129,7 +129,7 @@ public class StatementExpressionParser : SqlServerStatementExpressionParser
if (reader.TokenType == TokenType.String || reader.TokenType == TokenType.ColumnIdentifier)
{
columnBuilder.Append(".").Append(reader.TokenValue);
columnBuilder.Append('.').Append(reader.TokenValue);
reader.Read();
}
else
@@ -191,7 +191,7 @@ public class StatementExpressionParser : SqlServerStatementExpressionParser
if (reader.TokenType == TokenType.ColumnIdentifier || reader.TokenType == TokenType.String)
{
columnBuilder.Append(".").Append(reader.TokenValue);
columnBuilder.Append('.').Append(reader.TokenValue);
reader.Read();
}
else
+1 -1
View File
@@ -11,7 +11,7 @@ public class Value
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(ProcedureName.Clause);
sb.Append("(");
sb.Append('(');
if (IsUsingParameters)
{
@@ -68,7 +68,7 @@ public class ProcedureBreakdown : SqlServerProcedureBreakdown
sb.Append(string.Join(", ", paramList));
}
sb.Append(")");
sb.Append(')');
return sb.ToString();
}
@@ -141,7 +141,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
if (parameterName.StartsWith('@'))
{
return ":" + parameterName.Substring(1);
return string.Concat(":", parameterName.AsSpan(1));
}
// Add : prefix
@@ -159,7 +159,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
if (paramName.StartsWith(':'))
{
// Add @param version
var atParam = "@" + paramName.Substring(1);
var atParam = string.Concat("@", paramName.AsSpan(1));
if (!Parameters.ContainsKey(atParam))
{
Parameters[atParam] = Parameters[paramName];
@@ -168,7 +168,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
else if (paramName.StartsWith('@'))
{
// Add :param version
var colonParam = ":" + paramName.Substring(1);
var colonParam = string.Concat(":", paramName.AsSpan(1));
if (!Parameters.ContainsKey(colonParam))
{
Parameters[colonParam] = Parameters[paramName];
@@ -539,7 +539,7 @@ public class QueryBreakdown : SqlServerQueryBreakdown
if (i > 0)
{
sb.Append(",");
sb.Append(',');
sb.AppendLine();
}
@@ -67,7 +67,7 @@ public class QueryBreakdownCollection : SqlServer.QueryBreakdownCollectionBase<Q
if (!trimmed.EndsWith(';'))
{
sb.Append(";");
sb.Append(';');
}
// Add spacing between statements
@@ -111,7 +111,7 @@ public class QueryBreakdownCollection : SqlServer.QueryBreakdownCollectionBase<Q
return true;
}
var specificPattern = stageName.Contains("~")
var specificPattern = stageName.Contains('~')
? $@"@~/{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>
private static bool UsesStageReference(QueryBreakdown query)
{
return query.GetSql().Contains("@") &&
return query.GetSql().Contains('@') &&
(query.GetSql().Contains("FROM @") || query.GetSql().Contains(" @"));
}
@@ -41,7 +41,7 @@ public static class GuidUtils
return Guid.Empty;
}
if (value.Contains("-"))
if (value.Contains('-'))
{
// This function was called on an already valid guid
return new Guid(value);
@@ -92,7 +92,7 @@ public static class GuidUtils
var sb = new System.Text.StringBuilder(newguid);
while (sb.Length < Guid.Empty.ToString().Length)
{
sb.Append(sb.ToString());
sb.Append(sb);
}
newguid = sb.ToString();
@@ -114,7 +114,7 @@ public static class GuidUtils
for (int i = 0; i < guidChars.Length; 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];
}
@@ -16,7 +16,7 @@ public static partial class SqlUtils
public static void AppendAliasColumnWithComma(StringBuilder stringBuilder, string alias, string columnName)
{
stringBuilder.Append(alias);
stringBuilder.Append(".");
stringBuilder.Append('.');
stringBuilder.Append(columnName);
stringBuilder.AppendLine(",");
}
@@ -58,7 +58,7 @@ public static partial class SqlUtils
{
stringBuilder.Append("CAST(");
stringBuilder.Append(alias);
stringBuilder.Append(".");
stringBuilder.Append('.');
stringBuilder.Append(columnName);
stringBuilder.Append(" AS ");
stringBuilder.Append(dataType);
@@ -94,7 +94,7 @@ public static partial class SqlUtils
{
if (i > 0)
{
sb.Append(",");
sb.Append(',');
}
string trimmed = columnNames[i].Trim();
@@ -42,10 +42,10 @@ public static partial class SqlUtils
foreach (Guid g in guidList)
{
sb.Append("'");
sb.Append('\'');
sb.Append(g.ToString());
sb.Append("'");
sb.Append(",");
sb.Append('\'');
sb.Append(',');
}
return sb.ToString().Trim().TrimEnd(',');
@@ -27,7 +27,7 @@ public static partial class SqlUtils
double.TryParse(value, out double dblValue);
// Optimize IN if only one value
if (operation == FilterOperation.In && !value.Contains(","))
if (operation == FilterOperation.In && !value.Contains(','))
{
operation = FilterOperation.Equal;
}
@@ -144,7 +144,7 @@ public static partial class SqlUtils
}
int lastCloseParen = sb.ToString().LastIndexOf(')');
filter.SqlExpression = sb.ToString().Substring(0, lastCloseParen + 1) + ")";
filter.SqlExpression = string.Concat(sb.ToString().AsSpan(0, lastCloseParen + 1), ")");
break;
case FilterOperation.NotBetween:
@@ -578,7 +578,7 @@ public class QueryBreakdown : SqlBreakdownBase, IQueryBreakdown
if (i > 0)
{
sb.Append(",");
sb.Append(',');
sb.AppendLine();
}
@@ -513,7 +513,7 @@ public class QueryBreakdownTests
// Assert
// 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(merged[userIdKey], Is.EqualTo(123)); // Main query value, not CTE value
}
@@ -559,9 +559,9 @@ public class QueryBreakdownTests
var merged = mainQuery.GetMergedParameters();
// Assert
var dateKey = merged.Keys.FirstOrDefault(k => k.Contains("CreatedDate") && !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 dateKey = merged.Keys.FirstOrDefault(k => k.Contains("CreatedDate") && !k.Contains('$'));
var boolKey = merged.Keys.FirstOrDefault(k => k.Contains("IsActive") && !k.Contains('$'));
var doubleKey = merged.Keys.FirstOrDefault(k => k.Contains("Threshold") && !k.Contains('$'));
Assert.That(dateKey, Is.Not.Null);
Assert.That(merged[dateKey], Is.TypeOf<DateTime>());
@@ -133,7 +133,7 @@ public class TestRuleInput
public string? ImGoingToMakeThisNull { get; set; } = null;
public TestRuleDetail[] Details { get; set; } = { };
public TestRuleDetail[] Details { get; set; } = Array.Empty<TestRuleDetail>();
}
public class TestRuleDetail
@@ -31,7 +31,7 @@ public class ExpressionFactoryFilterTests : ExpressionTestsBase
).SetName("CalendarFilter_{m}");
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}'"
).SetName("TimeframeFilter_{m}");
}
@@ -174,7 +174,7 @@ public class RecursiveCTETests
var merged = mainQuery.GetMergedParameters();
// 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(merged[statusKey], Is.EqualTo("active"), "Main query parameter should take precedence");
}