diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers.md b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers.md index fd1fcef90923..439fc000c36f 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers.md +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers.md @@ -1358,7 +1358,7 @@ Enumerable.Count() potentially enumerates the sequence while a Length/Count prop ## [CA1830](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1830): Prefer strongly-typed Append and Insert method overloads on StringBuilder -StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. +StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). |Item|Value| |-|-| diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers.sarif b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers.sarif index f36c59791cd4..b9092f16d745 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers.sarif +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers.sarif @@ -2789,7 +2789,7 @@ "CA1830": { "id": "CA1830", "shortDescription": "Prefer strongly-typed Append and Insert method overloads on StringBuilder", - "fullDescription": "StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload.", + "fullDescription": "StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)).", "defaultLevel": "note", "helpUri": "https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1830", "properties": { diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/MicrosoftNetCoreAnalyzersResources.resx b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/MicrosoftNetCoreAnalyzersResources.resx index bacbfc1fe9cb..ecb112fa90b4 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/MicrosoftNetCoreAnalyzersResources.resx +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/MicrosoftNetCoreAnalyzersResources.resx @@ -1287,14 +1287,17 @@ Prefer strongly-typed Append and Insert method overloads on StringBuilder - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). - Remove the ToString call in order to use a strongly-typed StringBuilder overload + Prefer strongly-typed StringBuilder overload Remove the ToString call + + Use StringBuilder.Append(char, int) overload + Calls to 'string.IndexOf' where the result is used to check for the presence/absence of a substring can be replaced by 'string.Contains'. diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloads.Fixer.cs b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloads.Fixer.cs index 1f2a6bfe7ee3..7b3d67aaf86b 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloads.Fixer.cs +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloads.Fixer.cs @@ -29,26 +29,59 @@ public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) SyntaxNode root = await doc.GetRequiredSyntaxRootAsync(cancellationToken).ConfigureAwait(false); if (root.FindNode(context.Span) is SyntaxNode expression) { - string title = MicrosoftNetCoreAnalyzersResources.PreferTypedStringBuilderAppendOverloadsRemoveToString; - context.RegisterCodeFix( - CodeAction.Create(title, - async ct => - { - SemanticModel model = await doc.GetRequiredSemanticModelAsync(cancellationToken).ConfigureAwait(false); - if (model.GetOperationWalkingUpParentChain(expression, cancellationToken) is IArgumentOperation arg && - arg.Value is IInvocationOperation invoke && - invoke.Instance?.Syntax is SyntaxNode replacement) + SemanticModel model = await doc.GetRequiredSemanticModelAsync(cancellationToken).ConfigureAwait(false); + var operation = model.GetOperationWalkingUpParentChain(expression, cancellationToken); + + // Handle ToString() case + if (operation is IArgumentOperation arg && + arg.Value is IInvocationOperation invoke && + invoke.Instance?.Syntax is SyntaxNode replacement) + { + string title = MicrosoftNetCoreAnalyzersResources.PreferTypedStringBuilderAppendOverloadsRemoveToString; + context.RegisterCodeFix( + CodeAction.Create(title, + async ct => { DocumentEditor editor = await DocumentEditor.CreateAsync(doc, ct).ConfigureAwait(false); editor.ReplaceNode(expression, editor.Generator.Argument(replacement)); return editor.GetChangedDocument(); - } + }, + equivalenceKey: title), + context.Diagnostics); + } + // Handle new string(char, int) case (only for Append, not Insert) + else if (operation is IArgumentOperation argOp && + argOp.Value is IObjectCreationOperation objectCreation && + objectCreation.Arguments.Length == 2 && + argOp.Parent is IInvocationOperation invocationOp && + invocationOp.TargetMethod.Name == "Append") + { + string title = MicrosoftNetCoreAnalyzersResources.PreferTypedStringBuilderAppendOverloadsReplaceStringConstructor; + context.RegisterCodeFix( + CodeAction.Create(title, + async ct => + { + DocumentEditor editor = await DocumentEditor.CreateAsync(doc, ct).ConfigureAwait(false); - return doc; - }, - equivalenceKey: title), - context.Diagnostics); + // Get the char and int arguments from the string constructor + var charArgSyntax = objectCreation.Arguments[0].Value.Syntax; + var intArgSyntax = objectCreation.Arguments[1].Value.Syntax; + + // Append(new string(c, count)) -> Append(c, count) + SyntaxNode newInvocation = editor.Generator.InvocationExpression( + editor.Generator.MemberAccessExpression( + invocationOp.Instance!.Syntax, + "Append"), + editor.Generator.Argument(charArgSyntax), + editor.Generator.Argument(intArgSyntax)); + + editor.ReplaceNode(invocationOp.Syntax, newInvocation); + return editor.GetChangedDocument(); + }, + equivalenceKey: title), + context.Diagnostics); + } } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloads.cs b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloads.cs index 632356ea00b0..af60c5b9dc03 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloads.cs +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloads.cs @@ -65,6 +65,16 @@ public sealed override void Initialize(AnalysisContext context) s.Parameters[1].Type.SpecialType != SpecialType.System_Object && s.Parameters[1].Type.TypeKind != TypeKind.Array); + // Get the Append(char, int) overload for the string constructor pattern. + // Note: There is no Insert(int, char, int) overload, so we only handle Append. + var appendCharIntMethod = stringBuilderType + .GetMembers("Append") + .OfType() + .FirstOrDefault(s => + s.Parameters.Length == 2 && + s.Parameters[0].Type.SpecialType == SpecialType.System_Char && + s.Parameters[1].Type.SpecialType == SpecialType.System_Int32); + // Get the StringBuilder.Append(string)/Insert(int, string) method, for comparison purposes. var appendStringMethod = appendMethods.FirstOrDefault(s => s.Parameters[0].Type.SpecialType == SpecialType.System_String); @@ -97,28 +107,43 @@ public sealed override void Initialize(AnalysisContext context) return; } - // We're only interested if the string argument is a "string ToString()" call. if (invocation.Arguments.Length != stringParamIndex + 1 || - invocation.Arguments[stringParamIndex] is not IArgumentOperation argument || - argument.Value is not IInvocationOperation toStringInvoke || - toStringInvoke.TargetMethod.Name != "ToString" || - toStringInvoke.Type?.SpecialType != SpecialType.System_String || - !toStringInvoke.TargetMethod.Parameters.IsEmpty) + invocation.Arguments[stringParamIndex] is not IArgumentOperation argument) { return; } - // We're only interested if the receiver type of that ToString call has a corresponding strongly-typed overload. - IMethodSymbol? stronglyTypedAppend = - (stringParamIndex == 0 ? appendMethods : insertMethods) - .FirstOrDefault(s => s.Parameters[stringParamIndex].Type.Equals(toStringInvoke.TargetMethod.ReceiverType)); - if (stronglyTypedAppend is null) + // Check if the string argument is a "string ToString()" call. + if (argument.Value is IInvocationOperation toStringInvoke && + toStringInvoke.TargetMethod.Name == "ToString" && + toStringInvoke.Type?.SpecialType == SpecialType.System_String && + toStringInvoke.TargetMethod.Parameters.IsEmpty) { - return; - } + // We're only interested if the receiver type of that ToString call has a corresponding strongly-typed overload. + IMethodSymbol? stronglyTypedAppend = + (stringParamIndex == 0 ? appendMethods : insertMethods) + .FirstOrDefault(s => s.Parameters[stringParamIndex].Type.Equals(toStringInvoke.TargetMethod.ReceiverType)); + if (stronglyTypedAppend is null) + { + return; + } - // Warn. - operationContext.ReportDiagnostic(toStringInvoke.CreateDiagnostic(Rule)); + // Warn. + operationContext.ReportDiagnostic(toStringInvoke.CreateDiagnostic(Rule)); + } + // Check if the string argument is a "new string(char, int)" constructor call. + // Note: This optimization only applies to Append, not Insert, as there's no Insert(int, char, int) overload. + else if (stringParamIndex == 0 && + argument.Value is IObjectCreationOperation objectCreation && + objectCreation.Type?.SpecialType == SpecialType.System_String && + objectCreation.Arguments.Length == 2 && + objectCreation.Arguments[0].Value?.Type?.SpecialType == SpecialType.System_Char && + objectCreation.Arguments[1].Value?.Type?.SpecialType == SpecialType.System_Int32 && + appendCharIntMethod is not null) + { + // Warn. + operationContext.ReportDiagnostic(objectCreation.CreateDiagnostic(Rule)); + } }, OperationKind.Invocation); }); } diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.cs.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.cs.xlf index 547cfec47e45..4c369a1a34ad 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.cs.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.cs.xlf @@ -2314,13 +2314,13 @@ Rozšíření a uživatelem definované převody se u obecných typů nepodporuj - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append a StringBuilder.Insert nabízejí přetížení kromě System.String i několika dalším typům. Kdykoli je to možné, upřednostňujte před metodou ToString() přetížení silného typu a přetížení založené na řetězcích. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append a StringBuilder.Insert nabízejí přetížení kromě System.String i několika dalším typům. Kdykoli je to možné, upřednostňujte před metodou ToString() přetížení silného typu a přetížení založené na řetězcích. - Remove the ToString call in order to use a strongly-typed StringBuilder overload - Odeberte volání ToString, aby se používalo přetížení StringBuilder silného typu. + Prefer strongly-typed StringBuilder overload + Odeberte volání ToString, aby se používalo přetížení StringBuilder silného typu. @@ -2328,6 +2328,11 @@ Rozšíření a uživatelem definované převody se u obecných typů nepodporuj Odeberte volání ToString. + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder Upřednostňovat pro StringBuilder přetížení metod Append a Insert silného typu diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.de.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.de.xlf index a13fa704ba8f..90c525590d5a 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.de.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.de.xlf @@ -2314,13 +2314,13 @@ Erweiterungen und benutzerdefinierte Konvertierungen werden bei generischen Type - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append und StringBuilder.Insert stellen Überladungen für verschiedene Typen über System.String hinaus bereit. Sofern möglich, geben Sie den stark typisierten Überladungen Vorrang vor einer Verwendung von ToString() und zeichenfolgenbasierten Überladungen. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append und StringBuilder.Insert stellen Überladungen für verschiedene Typen über System.String hinaus bereit. Sofern möglich, geben Sie den stark typisierten Überladungen Vorrang vor einer Verwendung von ToString() und zeichenfolgenbasierten Überladungen. - Remove the ToString call in order to use a strongly-typed StringBuilder overload - Entfernen Sie den Aufruf von "ToString", um eine stark typisierte StringBuilder-Überladung zu verwenden. + Prefer strongly-typed StringBuilder overload + Entfernen Sie den Aufruf von "ToString", um eine stark typisierte StringBuilder-Überladung zu verwenden. @@ -2328,6 +2328,11 @@ Erweiterungen und benutzerdefinierte Konvertierungen werden bei generischen Type ToString-Aufruf entfernen + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder Stark typisierte Append- und Insert-Methodenüberladungen für StringBuilder bevorzugen diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.es.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.es.xlf index 1c86fe791114..b49c63330fec 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.es.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.es.xlf @@ -2314,13 +2314,13 @@ La ampliación y las conversiones definidas por el usuario no se admiten con tip - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append y StringBuilder.Insert proporcionan sobrecargas para varios tipos aparte de System.String. Cuando sea posible, elija preferentemente las sobrecargas fuertemente tipadas frente al uso de ToString() y la sobrecarga basada en cadenas. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append y StringBuilder.Insert proporcionan sobrecargas para varios tipos aparte de System.String. Cuando sea posible, elija preferentemente las sobrecargas fuertemente tipadas frente al uso de ToString() y la sobrecarga basada en cadenas. - Remove the ToString call in order to use a strongly-typed StringBuilder overload - Quite la llamada a ToString para usar una sobrecarga StringBuilder fuertemente tipada. + Prefer strongly-typed StringBuilder overload + Quite la llamada a ToString para usar una sobrecarga StringBuilder fuertemente tipada. @@ -2328,6 +2328,11 @@ La ampliación y las conversiones definidas por el usuario no se admiten con tip Quitar la llamada a ToString + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder Prefiera las sobrecargas de método Append e Insert fuertemente tipadas en StringBuilder diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.fr.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.fr.xlf index 36c5534b8962..22b8df630ee8 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.fr.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.fr.xlf @@ -2314,13 +2314,13 @@ Les conversions étendues et définies par l’utilisateur ne sont pas prises en - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append et StringBuilder.Insert fournissent des surcharges pour plusieurs types au-delà de System.String. Quand cela est possible, préférez les surcharges fortement typées à l'utilisation de ToString() et de la surcharge basée sur une chaîne. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append et StringBuilder.Insert fournissent des surcharges pour plusieurs types au-delà de System.String. Quand cela est possible, préférez les surcharges fortement typées à l'utilisation de ToString() et de la surcharge basée sur une chaîne. - Remove the ToString call in order to use a strongly-typed StringBuilder overload - Supprimez l'appel de ToString pour utiliser une surcharge StringBuilder fortement typée + Prefer strongly-typed StringBuilder overload + Supprimez l'appel de ToString pour utiliser une surcharge StringBuilder fortement typée @@ -2328,6 +2328,11 @@ Les conversions étendues et définies par l’utilisateur ne sont pas prises en Supprimer l'appel de ToString + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder Préférez les surcharges de méthode Append et Insert fortement typées sur StringBuilder diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.it.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.it.xlf index 6c3d97692a3c..d08e490095a6 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.it.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.it.xlf @@ -2314,13 +2314,13 @@ L'ampliamento e le conversioni definite dall'utente non sono supportate con tipi - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append e StringBuilder.Insert forniscono overload per più tipi oltre System.String. Quando possibile, preferire gli overload fortemente tipizzati invece di usare ToString() e l'overload basato su stringhe. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append e StringBuilder.Insert forniscono overload per più tipi oltre System.String. Quando possibile, preferire gli overload fortemente tipizzati invece di usare ToString() e l'overload basato su stringhe. - Remove the ToString call in order to use a strongly-typed StringBuilder overload - Rimuovere la chiamata ToString per usare un overload di StringBuilder fortemente tipizzato + Prefer strongly-typed StringBuilder overload + Rimuovere la chiamata ToString per usare un overload di StringBuilder fortemente tipizzato @@ -2328,6 +2328,11 @@ L'ampliamento e le conversioni definite dall'utente non sono supportate con tipi Rimuovere la chiamata a ToString + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder Preferire gli overload di metodi Append e Insert fortemente tipizzati su StringBuilder diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ja.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ja.xlf index 8c4aa8a20ea1..097b635e9e1d 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ja.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ja.xlf @@ -2314,13 +2314,13 @@ Enumerable.OfType<T> で使用されるジェネリック型チェック ( - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append および StringBuilder.Insert では、System.String 以外の複数の型に対してオーバーロードを提供します。可能であれば、ToString () と文字列ベースのオーバーロードを使用するよりも、厳密に型指定されたオーバーロードを優先して使用することをお勧めします。 + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append および StringBuilder.Insert では、System.String 以外の複数の型に対してオーバーロードを提供します。可能であれば、ToString () と文字列ベースのオーバーロードを使用するよりも、厳密に型指定されたオーバーロードを優先して使用することをお勧めします。 - Remove the ToString call in order to use a strongly-typed StringBuilder overload - 厳密に型指定された StringBuilder のオーバーロードを使用するには、ToString 呼び出しを削除してください + Prefer strongly-typed StringBuilder overload + 厳密に型指定された StringBuilder のオーバーロードを使用するには、ToString 呼び出しを削除してください @@ -2328,6 +2328,11 @@ Enumerable.OfType<T> で使用されるジェネリック型チェック ( ToString 呼び出しを削除する + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder StringBuilder での厳密に型指定された Append および Insert メソッドのオーバーロードを推奨 diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ko.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ko.xlf index 47929d1c21f5..07f1595a9512 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ko.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ko.xlf @@ -2314,13 +2314,13 @@ Enumerable.OfType<T>에서 사용하는 제네릭 형식 검사(C# 'is' - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append 및 StringBuilder.Insert는 System.String 외의 여러 형식에 대한 오버로드를 제공합니다. 가능한 경우 ToString() 및 문자열 기반 오버로드를 사용하는 대신 강력한 형식의 오버로드를 사용하세요. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append 및 StringBuilder.Insert는 System.String 외의 여러 형식에 대한 오버로드를 제공합니다. 가능한 경우 ToString() 및 문자열 기반 오버로드를 사용하는 대신 강력한 형식의 오버로드를 사용하세요. - Remove the ToString call in order to use a strongly-typed StringBuilder overload - 강력한 형식의 StringBuilder 오버로드를 사용하려면 ToString 호출을 제거하세요. + Prefer strongly-typed StringBuilder overload + 강력한 형식의 StringBuilder 오버로드를 사용하려면 ToString 호출을 제거하세요. @@ -2328,6 +2328,11 @@ Enumerable.OfType<T>에서 사용하는 제네릭 형식 검사(C# 'is' ToString 호출 제거 + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder StringBuilder 대신 강력한 형식의 Append 및 Insert 메서드 오버로드를 사용 diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.pl.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.pl.xlf index f8c701db54b3..2572ec0b17a9 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.pl.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.pl.xlf @@ -2314,13 +2314,13 @@ Konwersje poszerzane i zdefiniowane przez użytkownika nie są obsługiwane w pr - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - Metody StringBuilder.Append i StringBuilder.Insert zapewniają przeciążenia dla wielu typów oprócz typu System.String. Jeśli to możliwe, preferuj silnie typizowane przeciążenia zamiast używania metody ToString() i przeciążenia opartego na ciągu. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + Metody StringBuilder.Append i StringBuilder.Insert zapewniają przeciążenia dla wielu typów oprócz typu System.String. Jeśli to możliwe, preferuj silnie typizowane przeciążenia zamiast używania metody ToString() i przeciążenia opartego na ciągu. - Remove the ToString call in order to use a strongly-typed StringBuilder overload - Usuń wywołanie metody ToString, aby użyć silnie typizowanego przeciążenia elementu StringBuilder + Prefer strongly-typed StringBuilder overload + Usuń wywołanie metody ToString, aby użyć silnie typizowanego przeciążenia elementu StringBuilder @@ -2328,6 +2328,11 @@ Konwersje poszerzane i zdefiniowane przez użytkownika nie są obsługiwane w pr Usuń wywołanie metody ToString + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder Preferuj silnie typizowane metody Append i Insert w elemencie StringBuilder diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.pt-BR.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.pt-BR.xlf index 71cde1d01b0c..97ddcd0d13ae 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.pt-BR.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.pt-BR.xlf @@ -2314,13 +2314,13 @@ As ampliação e conversões definidas pelo usuário não são compatíveis com - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append e StringBuilder.Insert fornecem sobrecargas para vários tipos além de System.String. Quando possível, prefira as sobrecargas fortemente tipadas usando ToString() e a sobrecarga baseada em cadeia de caracteres. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append e StringBuilder.Insert fornecem sobrecargas para vários tipos além de System.String. Quando possível, prefira as sobrecargas fortemente tipadas usando ToString() e a sobrecarga baseada em cadeia de caracteres. - Remove the ToString call in order to use a strongly-typed StringBuilder overload - Remova a chamada ToString para usar uma sobrecarga de StringBuilder fortemente tipada + Prefer strongly-typed StringBuilder overload + Remova a chamada ToString para usar uma sobrecarga de StringBuilder fortemente tipada @@ -2328,6 +2328,11 @@ As ampliação e conversões definidas pelo usuário não são compatíveis com Remover a chamada ToString + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder Prefira sobrecargas de método Append e Insert fortemente tipadas no StringBuilder diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ru.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ru.xlf index 355273e1bf08..338141e13c7d 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ru.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.ru.xlf @@ -2314,13 +2314,13 @@ Widening and user defined conversions are not supported with generic types. - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append и StringBuilder.Insert предоставляют перегрузки для нескольких типов наряду с System.String. Если это возможно, рекомендуется использовать строго типизированные перегрузки и перегрузки на основе строк вместо метода ToString(). + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append и StringBuilder.Insert предоставляют перегрузки для нескольких типов наряду с System.String. Если это возможно, рекомендуется использовать строго типизированные перегрузки и перегрузки на основе строк вместо метода ToString(). - Remove the ToString call in order to use a strongly-typed StringBuilder overload - Удалите вызов ToString и используйте строго типизированную перегрузку StringBuilder. + Prefer strongly-typed StringBuilder overload + Удалите вызов ToString и используйте строго типизированную перегрузку StringBuilder. @@ -2328,6 +2328,11 @@ Widening and user defined conversions are not supported with generic types.Удалите вызов ToString + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder Рекомендация использовать строго типизированные перегрузки методов Append и Insert в StringBuilder diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.tr.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.tr.xlf index 33786bf42bc7..b82481f6234f 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.tr.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.tr.xlf @@ -2314,13 +2314,13 @@ Genel türlerde genişletme ve kullanıcı tanımlı dönüştürmeler desteklen - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append ve StringBuilder.Insert, System.String'in ötesinde birden çok türe yönelik aşırı yükleme sağlar. Mümkün olduğunda, ToString() ve dize tabanlı aşırı yüklemeyi kullanmak yerine kesin tür belirtilmiş aşırı yüklemeleri tercih edin. + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append ve StringBuilder.Insert, System.String'in ötesinde birden çok türe yönelik aşırı yükleme sağlar. Mümkün olduğunda, ToString() ve dize tabanlı aşırı yüklemeyi kullanmak yerine kesin tür belirtilmiş aşırı yüklemeleri tercih edin. - Remove the ToString call in order to use a strongly-typed StringBuilder overload - Kesin tür belirtilmiş bir StringBuilder aşırı yüklemesi kullanmak için ToString çağrısını kaldırın + Prefer strongly-typed StringBuilder overload + Kesin tür belirtilmiş bir StringBuilder aşırı yüklemesi kullanmak için ToString çağrısını kaldırın @@ -2328,6 +2328,11 @@ Genel türlerde genişletme ve kullanıcı tanımlı dönüştürmeler desteklen ToString çağrısını kaldırın + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder StringBuilder'da kesin tür belirtilmiş Append ve Insert metodu aşırı yüklemelerini tercih edin diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.zh-Hans.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.zh-Hans.xlf index c9ff6d540e03..ba0e7cc20a7c 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.zh-Hans.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.zh-Hans.xlf @@ -2314,13 +2314,13 @@ Enumerable.OfType<T> 使用的泛型类型检查(C# 'is' operator/IL 'isin - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append 和 StringBuilder.Insert 为 System.String 之外的多种类型提供重载。在可能情况下,尽量使用强类型重载而非使用 ToString() 和基于字符串的重载。 + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append 和 StringBuilder.Insert 为 System.String 之外的多种类型提供重载。在可能情况下,尽量使用强类型重载而非使用 ToString() 和基于字符串的重载。 - Remove the ToString call in order to use a strongly-typed StringBuilder overload - 删除 ToString 调用以使用强类型 StringBuilder 重载 + Prefer strongly-typed StringBuilder overload + 删除 ToString 调用以使用强类型 StringBuilder 重载 @@ -2328,6 +2328,11 @@ Enumerable.OfType<T> 使用的泛型类型检查(C# 'is' operator/IL 'isin 删除 ToString 调用 + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder 最好使用 StringBuilder 的强类型 Append 和 Insert 方法重载 diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.zh-Hant.xlf b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.zh-Hant.xlf index 96185b9b1822..edd8080c702f 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.zh-Hant.xlf +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/xlf/MicrosoftNetCoreAnalyzersResources.zh-Hant.xlf @@ -2314,13 +2314,13 @@ Enumerable.OfType<T> 使用的一般型別檢查 (C# 'is' operator/IL 'isi - StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. - StringBuilder.Append 與 StringBuilder.Insert 可為 System.String 以外的多種類型提供多載。建議盡可能使用強型別多載,而非 ToString() 與字串式多載。 + StringBuilder.Append and StringBuilder.Insert provide overloads for multiple types beyond System.String. When possible, prefer the strongly-typed overloads over using ToString() and the string-based overload. Additionally, prefer Append(char, int) over Append(new string(char, int)). + StringBuilder.Append 與 StringBuilder.Insert 可為 System.String 以外的多種類型提供多載。建議盡可能使用強型別多載,而非 ToString() 與字串式多載。 - Remove the ToString call in order to use a strongly-typed StringBuilder overload - 移除 ToString 呼叫,以使用強型別 StringBuilder 多載 + Prefer strongly-typed StringBuilder overload + 移除 ToString 呼叫,以使用強型別 StringBuilder 多載 @@ -2328,6 +2328,11 @@ Enumerable.OfType<T> 使用的一般型別檢查 (C# 'is' operator/IL 'isi 移除 ToString 呼叫 + + Use StringBuilder.Append(char, int) overload + Use StringBuilder.Append(char, int) overload + + Prefer strongly-typed Append and Insert method overloads on StringBuilder 建議在 StringBuilder 上使用強型別 Append 及 Insert 方法多載 diff --git a/src/Microsoft.CodeAnalysis.NetAnalyzers/tests/Microsoft.CodeAnalysis.NetAnalyzers.UnitTests/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloadsTests.cs b/src/Microsoft.CodeAnalysis.NetAnalyzers/tests/Microsoft.CodeAnalysis.NetAnalyzers.UnitTests/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloadsTests.cs index ec32a3f8cbfa..04064c09f233 100644 --- a/src/Microsoft.CodeAnalysis.NetAnalyzers/tests/Microsoft.CodeAnalysis.NetAnalyzers.UnitTests/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloadsTests.cs +++ b/src/Microsoft.CodeAnalysis.NetAnalyzers/tests/Microsoft.CodeAnalysis.NetAnalyzers.UnitTests/Microsoft.NetCore.Analyzers/Runtime/PreferTypedStringBuilderAppendOverloadsTests.cs @@ -260,5 +260,82 @@ private static void Append(string value) { } private static void Append(int value) { } }"); } + + [Fact] + public async Task Diagnostic_StringConstructorInAppend_CSharpAsync() + { + await VerifyCS.VerifyCodeFixAsync(@" + using System.Text; + + class C + { + public void M() + { + var sb = new StringBuilder(); + sb.Append([|new string('c', 5)|]); + } + } + ", @" + using System.Text; + + class C + { + public void M() + { + var sb = new StringBuilder(); + sb.Append('c', 5); + } + } + "); + } + + [Fact] + public async Task Diagnostic_StringConstructorWithVariable_CSharpAsync() + { + await VerifyCS.VerifyCodeFixAsync(@" + using System.Text; + + class C + { + public void M() + { + var sb = new StringBuilder(); + char c = 'a'; + int count = 3; + sb.Append([|new string(c, count)|]); + } + } + ", @" + using System.Text; + + class C + { + public void M() + { + var sb = new StringBuilder(); + char c = 'a'; + int count = 3; + sb.Append(c, count); + } + } + "); + } + + [Fact] + public async Task NoDiagnostic_StringConstructorWithCharArray_CSharpAsync() + { + await VerifyCS.VerifyAnalyzerAsync(@" + using System.Text; + + class C + { + public void M() + { + var sb = new StringBuilder(); + char[] chars = new char[] { 'a', 'b', 'c' }; + sb.Append(new string(chars)); + } + }"); + } } }