From 2c2a8b1193e59c2215f82000cd556ca88bf1946c Mon Sep 17 00:00:00 2001 From: Thom Lamb Date: Tue, 26 May 2026 15:38:54 -0500 Subject: [PATCH] chore(sonar): bulk-fix mechanical CA/IDE analyzer warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .../Breakdowns/LinqQueryBreakdown.cs | 2 +- .../Visitors/LinqExpressionVisitor.cs | 4 ++-- .../Expressions/ExpressionGenerator.cs | 6 +++--- .../SqlServer/QueryBreakdownGenerator.cs | 2 +- .../SqlServer/SqlStatementGenerator.cs | 2 +- .../Statements/StatementExpressionParser.cs | 4 ++-- src/Strata.SqlTools.Query/Value.cs | 2 +- .../Breakdowns/ProcedureBreakdown.cs | 4 ++-- .../Breakdowns/QueryBreakdown.cs | 8 ++++---- .../Breakdowns/QueryBreakdownCollection.cs | 6 +++--- src/Strata.SqlTools.SqlBreakdown/Utilities/GuidUtils.cs | 6 +++--- .../Utilities/SqlColumnHelpers.cs | 6 +++--- .../Utilities/SqlGuidHelpers.cs | 6 +++--- .../Utilities/SqlUtils.Filters.cs | 4 ++-- .../Breakdowns/QueryBreakdown.cs | 2 +- .../PostgreSql/QueryBreakdownTests.cs | 8 ++++---- tests/Strata.SqlTools.Rules.Tests/RuleVisitorTests.cs | 2 +- .../ExpressionTests/ExpressionFactoryFilterTests.cs | 2 +- .../SqlServer/RecursiveCTETests.cs | 2 +- 19 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/Strata.SqlTools.LinqToSql/Breakdowns/LinqQueryBreakdown.cs b/src/Strata.SqlTools.LinqToSql/Breakdowns/LinqQueryBreakdown.cs index eac22d4..df6053e 100644 --- a/src/Strata.SqlTools.LinqToSql/Breakdowns/LinqQueryBreakdown.cs +++ b/src/Strata.SqlTools.LinqToSql/Breakdowns/LinqQueryBreakdown.cs @@ -580,7 +580,7 @@ public class LinqQueryBreakdown : QueryBreakdown /// True if SELECT contains *; otherwise, false. public bool SelectsAllColumns() { - return SelectClause?.Clause?.Contains("*") ?? false; + return SelectClause?.Clause?.Contains('*') ?? false; } /// diff --git a/src/Strata.SqlTools.LinqToSql/Visitors/LinqExpressionVisitor.cs b/src/Strata.SqlTools.LinqToSql/Visitors/LinqExpressionVisitor.cs index 26b6391..01f8bd9 100644 --- a/src/Strata.SqlTools.LinqToSql/Visitors/LinqExpressionVisitor.cs +++ b/src/Strata.SqlTools.LinqToSql/Visitors/LinqExpressionVisitor.cs @@ -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; } diff --git a/src/Strata.SqlTools.Markdown/Expressions/ExpressionGenerator.cs b/src/Strata.SqlTools.Markdown/Expressions/ExpressionGenerator.cs index f9b5505..a74e8e2 100644 --- a/src/Strata.SqlTools.Markdown/Expressions/ExpressionGenerator.cs +++ b/src/Strata.SqlTools.Markdown/Expressions/ExpressionGenerator.cs @@ -366,7 +366,7 @@ public class ExpressionGenerator : IVisitor { 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 { 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 { 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:"); diff --git a/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs b/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs index db32359..05bb1a2 100644 --- a/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs +++ b/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs @@ -201,7 +201,7 @@ public class QueryBreakdownGenerator return text; } - return text.Substring(0, maxLength) + "..."; + return string.Concat(text.AsSpan(0, maxLength), "..."); } } diff --git a/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs b/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs index 23cceb8..8c00dc6 100644 --- a/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs +++ b/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs @@ -122,7 +122,7 @@ public class SqlStatementGenerator return text; } - return text.Substring(0, maxLength) + "..."; + return string.Concat(text.AsSpan(0, maxLength), "..."); } /// diff --git a/src/Strata.SqlTools.PostgreSql/Statements/StatementExpressionParser.cs b/src/Strata.SqlTools.PostgreSql/Statements/StatementExpressionParser.cs index 130dc86..fc3cf9e 100644 --- a/src/Strata.SqlTools.PostgreSql/Statements/StatementExpressionParser.cs +++ b/src/Strata.SqlTools.PostgreSql/Statements/StatementExpressionParser.cs @@ -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 diff --git a/src/Strata.SqlTools.Query/Value.cs b/src/Strata.SqlTools.Query/Value.cs index c84325a..9672d29 100644 --- a/src/Strata.SqlTools.Query/Value.cs +++ b/src/Strata.SqlTools.Query/Value.cs @@ -11,7 +11,7 @@ public class Value public IEnumerable 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(), Array.Empty(), Array.Empty()) { } diff --git a/src/Strata.SqlTools.Snowflake/Breakdowns/ProcedureBreakdown.cs b/src/Strata.SqlTools.Snowflake/Breakdowns/ProcedureBreakdown.cs index 4e79517..9db037b 100644 --- a/src/Strata.SqlTools.Snowflake/Breakdowns/ProcedureBreakdown.cs +++ b/src/Strata.SqlTools.Snowflake/Breakdowns/ProcedureBreakdown.cs @@ -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(); } diff --git a/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs b/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs index 4ee4c10..4ab2451 100644 --- a/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs +++ b/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdown.cs @@ -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(); } diff --git a/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdownCollection.cs b/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdownCollection.cs index 3fe389d..e4d469f 100644 --- a/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdownCollection.cs +++ b/src/Strata.SqlTools.Snowflake/Breakdowns/QueryBreakdownCollection.cs @@ -67,7 +67,7 @@ public class QueryBreakdownCollection : SqlServer.QueryBreakdownCollectionBase private static bool UsesStageReference(QueryBreakdown query) { - return query.GetSql().Contains("@") && + return query.GetSql().Contains('@') && (query.GetSql().Contains("FROM @") || query.GetSql().Contains(" @")); } diff --git a/src/Strata.SqlTools.SqlBreakdown/Utilities/GuidUtils.cs b/src/Strata.SqlTools.SqlBreakdown/Utilities/GuidUtils.cs index a869cd0..08a4e34 100644 --- a/src/Strata.SqlTools.SqlBreakdown/Utilities/GuidUtils.cs +++ b/src/Strata.SqlTools.SqlBreakdown/Utilities/GuidUtils.cs @@ -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]; } diff --git a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlColumnHelpers.cs b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlColumnHelpers.cs index cfdf4d4..54c22a4 100644 --- a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlColumnHelpers.cs +++ b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlColumnHelpers.cs @@ -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(); diff --git a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlGuidHelpers.cs b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlGuidHelpers.cs index 0319599..b9f50ed 100644 --- a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlGuidHelpers.cs +++ b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlGuidHelpers.cs @@ -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(','); diff --git a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.Filters.cs b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.Filters.cs index 0bc03bd..235836b 100644 --- a/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.Filters.cs +++ b/src/Strata.SqlTools.SqlBreakdown/Utilities/SqlUtils.Filters.cs @@ -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: diff --git a/src/Strata.SqlTools.SqlServer/Breakdowns/QueryBreakdown.cs b/src/Strata.SqlTools.SqlServer/Breakdowns/QueryBreakdown.cs index b816559..b1faed0 100644 --- a/src/Strata.SqlTools.SqlServer/Breakdowns/QueryBreakdown.cs +++ b/src/Strata.SqlTools.SqlServer/Breakdowns/QueryBreakdown.cs @@ -578,7 +578,7 @@ public class QueryBreakdown : SqlBreakdownBase, IQueryBreakdown if (i > 0) { - sb.Append(","); + sb.Append(','); sb.AppendLine(); } diff --git a/tests/Strata.SqlTools.PostgreSql.Tests/PostgreSql/QueryBreakdownTests.cs b/tests/Strata.SqlTools.PostgreSql.Tests/PostgreSql/QueryBreakdownTests.cs index fdb2d29..542d615 100644 --- a/tests/Strata.SqlTools.PostgreSql.Tests/PostgreSql/QueryBreakdownTests.cs +++ b/tests/Strata.SqlTools.PostgreSql.Tests/PostgreSql/QueryBreakdownTests.cs @@ -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()); diff --git a/tests/Strata.SqlTools.Rules.Tests/RuleVisitorTests.cs b/tests/Strata.SqlTools.Rules.Tests/RuleVisitorTests.cs index cc0ee1e..bd2de7c 100644 --- a/tests/Strata.SqlTools.Rules.Tests/RuleVisitorTests.cs +++ b/tests/Strata.SqlTools.Rules.Tests/RuleVisitorTests.cs @@ -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(); } public class TestRuleDetail diff --git a/tests/Strata.SqlTools.SqlBreakdown.Tests/ExpressionTests/ExpressionFactoryFilterTests.cs b/tests/Strata.SqlTools.SqlBreakdown.Tests/ExpressionTests/ExpressionFactoryFilterTests.cs index eb5d708..dc9f9ee 100644 --- a/tests/Strata.SqlTools.SqlBreakdown.Tests/ExpressionTests/ExpressionFactoryFilterTests.cs +++ b/tests/Strata.SqlTools.SqlBreakdown.Tests/ExpressionTests/ExpressionFactoryFilterTests.cs @@ -31,7 +31,7 @@ public class ExpressionFactoryFilterTests : ExpressionTestsBase ).SetName("CalendarFilter_{m}"); yield return new TestCaseData( - new Filter(4, FilterType.Timeframe, new object[] { }, Array.Empty(), DatePart.Month, false, 1, 3), + new Filter(4, FilterType.Timeframe, Array.Empty(), Array.Empty(), DatePart.Month, false, 1, 3), $"DEPT.DISCHARGE_DATE >= '{startOfCurrentMonth:yyyy-MM-dd}' AND DEPT.DISCHARGE_DATE < '{startOfEndMonth:yyyy-MM-dd}'" ).SetName("TimeframeFilter_{m}"); } diff --git a/tests/Strata.SqlTools.SqlServer.Tests/SqlServer/RecursiveCTETests.cs b/tests/Strata.SqlTools.SqlServer.Tests/SqlServer/RecursiveCTETests.cs index 6880dc0..ba0d20e 100644 --- a/tests/Strata.SqlTools.SqlServer.Tests/SqlServer/RecursiveCTETests.cs +++ b/tests/Strata.SqlTools.SqlServer.Tests/SqlServer/RecursiveCTETests.cs @@ -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"); }