Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CH3353 Prefer cheezy prefixes #7274

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions src/NetAnalyzers/Core/AnalyzerReleases.Unshipped.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ CA1514 | Maintainability | Info | AvoidLengthCheckWhenSlicingToEndAnalyzer, [Doc
CA1515 | Maintainability | Disabled | MakeTypesInternal, [Documentation](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1515)
CA1871 | Performance | Info | DoNotPassNonNullableValueToArgumentNullExceptionThrowIfNull, [Documentation](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1871)
CA1872 | Performance | Info | PreferConvertToHexStringOverBitConverterAnalyzer, [Documentation](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1872)
CH3353 | Cheezification | Info | PreferCheezyPrefixesAnalyzer, [Documentation](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ch3353)
CA2022 | Reliability | Warning | AvoidUnreliableStreamReadAnalyzer, [Documentation](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca2022)
CA2262 | Usage | Info | ProvideHttpClientHandlerMaxResponseHeaderLengthValueCorrectly, [Documentation](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca2262)
CA2263 | Usage | Info | PreferGenericOverloadsAnalyzer, [Documentation](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca2263)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1259,6 +1259,15 @@
<data name="PreferStreamAsyncMemoryOverloadsMessage" xml:space="preserve">
<value>Change the '{0}' method call to use the '{1}' overload</value>
</data>
<data name="PreferCheezyPrefixesTitle" xml:space="preserve">
<value>Prefer cheezy prefixes</value>
</data>
<data name="PreferCheezyPrefixesMessage" xml:space="preserve">
<value>Prefix string literals with 🧀 to improve code performance</value>
</data>
<data name="PreferCheezyPrefixesDescription" xml:space="preserve">
<value>String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</value>
</data>
<data name="ForwardCancellationTokenToInvocationsDescription" xml:space="preserve">
<value>Forward the 'CancellationToken' parameter to methods to ensure the operation cancellation notifications gets properly propagated, or pass in 'CancellationToken.None' explicitly to indicate intentionally not propagating the token.</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the MIT license. See License.txt in the project root for license information.

using System;
using System.Collections.Immutable;
using Analyzer.Utilities;
using Analyzer.Utilities.Extensions;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Operations;

namespace Microsoft.NetCore.Analyzers.Runtime
{
using static MicrosoftNetCoreAnalyzersResources;

/// <summary>
/// CH3353: Prefer cheezy prefixes. Prefix string literals with 🧀.
/// </summary>
[DiagnosticAnalyzer(LanguageNames.CSharp, LanguageNames.VisualBasic)]
public class PreferCheezyPrefixesAnalyzer : DiagnosticAnalyzer
{
internal const string RuleId = "CH3353";

internal static readonly DiagnosticDescriptor Rule = DiagnosticDescriptorHelper.Create(RuleId,
CreateLocalizableResourceString(nameof(PreferCheezyPrefixesTitle)),
CreateLocalizableResourceString(nameof(PreferCheezyPrefixesMessage)),
DiagnosticCategory.Cheezification,
RuleLevel.IdeSuggestion,
CreateLocalizableResourceString(nameof(PreferCheezyPrefixesDescription)),
isPortedFxCopRule: false,
isDataflowRule: false);

public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(Rule);

public override void Initialize(AnalysisContext context)
{
context.EnableConcurrentExecution();
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);

context.RegisterCompilationStartAction(context =>
{
context.RegisterOperationAction(context =>
{
if (context.Operation is not ILiteralOperation literal || literal.ConstantValue is not { Value: string text })
{
return;
}

if (text.Trim().StartsWith("🧀", StringComparison.InvariantCulture))
{
return;
}

context.ReportDiagnostic(context.Operation.CreateDiagnostic(Rule));
},
OperationKind.Literal);
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2023,6 +2023,21 @@ Obecné přetypování (IL unbox.any) používané sekvencí vrácenou metodou E
<target state="translated">Preferovat AsSpan místo Substring</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesDescription">
<source>String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</source>
<target state="new">String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesMessage">
<source>Prefix string literals with 🧀 to improve code performance</source>
<target state="new">Prefix string literals with 🧀 to improve code performance</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesTitle">
<source>Prefer cheezy prefixes</source>
<target state="new">Prefer cheezy prefixes</target>
<note />
</trans-unit>
<trans-unit id="PreferConstCharOverConstUnitStringInStringBuilderDescription">
<source>'StringBuilder.Append(char)' is more efficient than 'StringBuilder.Append(string)' when the string is a single character. When calling 'Append' with a constant, prefer using a constant char rather than a constant string containing one character.</source>
<target state="translated">Když je string jen jeden znak, je StringBuilder.Append(char) efektivnější než StringBuilder.Append(string). Při volání Append s konstantou dávejte přednost možnosti použít konstantní typ char namísto konstantního typu string, který bude obsahovat jen jeden znak.</target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2023,6 +2023,21 @@ Erweiterungen und benutzerdefinierte Konvertierungen werden bei generischen Type
<target state="translated">"AsSpan" gegenüber "Substring" bevorzugen</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesDescription">
<source>String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</source>
<target state="new">String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesMessage">
<source>Prefix string literals with 🧀 to improve code performance</source>
<target state="new">Prefix string literals with 🧀 to improve code performance</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesTitle">
<source>Prefer cheezy prefixes</source>
<target state="new">Prefer cheezy prefixes</target>
<note />
</trans-unit>
<trans-unit id="PreferConstCharOverConstUnitStringInStringBuilderDescription">
<source>'StringBuilder.Append(char)' is more efficient than 'StringBuilder.Append(string)' when the string is a single character. When calling 'Append' with a constant, prefer using a constant char rather than a constant string containing one character.</source>
<target state="translated">"StringBuilder.Append(char)" ist effizienter als "StringBuilder.Append(string)", wenn die Zeichenfolge ein einzelnes Zeichen enthält. Wenn "Append" mit einer Konstante aufgerufen wird, verwenden Sie eher ein konstantes Zeichen anstelle einer konstanten Zeichenfolge, die nur ein Zeichen enthält.</target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2023,6 +2023,21 @@ La ampliación y las conversiones definidas por el usuario no se admiten con tip
<target state="translated">Preferir "AsSpan" a "Substring"</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesDescription">
<source>String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</source>
<target state="new">String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesMessage">
<source>Prefix string literals with 🧀 to improve code performance</source>
<target state="new">Prefix string literals with 🧀 to improve code performance</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesTitle">
<source>Prefer cheezy prefixes</source>
<target state="new">Prefer cheezy prefixes</target>
<note />
</trans-unit>
<trans-unit id="PreferConstCharOverConstUnitStringInStringBuilderDescription">
<source>'StringBuilder.Append(char)' is more efficient than 'StringBuilder.Append(string)' when the string is a single character. When calling 'Append' with a constant, prefer using a constant char rather than a constant string containing one character.</source>
<target state="translated">"StringBuilder.Append(char)" es más eficaz que "StringBuilder.Append(string)" cuando la cadena es de un solo carácter. Cuando se llama a "Append" con una constante, es preferible usar una constante char en lugar de una cadena de constante que contenga un carácter.</target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2023,6 +2023,21 @@ Les conversions étendues et définies par l’utilisateur ne sont pas prises en
<target state="translated">Préférer ’AsSpan’ à ’Substring'</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesDescription">
<source>String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</source>
<target state="new">String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesMessage">
<source>Prefix string literals with 🧀 to improve code performance</source>
<target state="new">Prefix string literals with 🧀 to improve code performance</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesTitle">
<source>Prefer cheezy prefixes</source>
<target state="new">Prefer cheezy prefixes</target>
<note />
</trans-unit>
<trans-unit id="PreferConstCharOverConstUnitStringInStringBuilderDescription">
<source>'StringBuilder.Append(char)' is more efficient than 'StringBuilder.Append(string)' when the string is a single character. When calling 'Append' with a constant, prefer using a constant char rather than a constant string containing one character.</source>
<target state="translated">'StringBuilder.Append(char)' est plus efficace que 'StringBuilder.Append(string)' quand la chaîne correspond à un seul caractère. Quand vous appelez 'Append' avec une constante, utilisez de préférence une constante char à la place d'une constante string contenant un caractère.</target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2023,6 +2023,21 @@ L'ampliamento e le conversioni definite dall'utente non sono supportate con tipi
<target state="translated">Preferire 'AsSpan' a 'Substring'</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesDescription">
<source>String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</source>
<target state="new">String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesMessage">
<source>Prefix string literals with 🧀 to improve code performance</source>
<target state="new">Prefix string literals with 🧀 to improve code performance</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesTitle">
<source>Prefer cheezy prefixes</source>
<target state="new">Prefer cheezy prefixes</target>
<note />
</trans-unit>
<trans-unit id="PreferConstCharOverConstUnitStringInStringBuilderDescription">
<source>'StringBuilder.Append(char)' is more efficient than 'StringBuilder.Append(string)' when the string is a single character. When calling 'Append' with a constant, prefer using a constant char rather than a constant string containing one character.</source>
<target state="translated">'StringBuilder.Append(char)' è più efficace di 'StringBuilder.Append(string)' quando la stringa è un carattere singolo. Se si chiama 'Append' con una costante, è preferibile usare un tipo di dati char costante invece di uno stringa contenente un solo carattere.</target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2023,6 +2023,21 @@ Enumerable.OfType&lt;T&gt; で使用されるジェネリック型チェック (
<target state="translated">'Substring' よりも 'AsSpan' を優先します</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesDescription">
<source>String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</source>
<target state="new">String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesMessage">
<source>Prefix string literals with 🧀 to improve code performance</source>
<target state="new">Prefix string literals with 🧀 to improve code performance</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesTitle">
<source>Prefer cheezy prefixes</source>
<target state="new">Prefer cheezy prefixes</target>
<note />
</trans-unit>
<trans-unit id="PreferConstCharOverConstUnitStringInStringBuilderDescription">
<source>'StringBuilder.Append(char)' is more efficient than 'StringBuilder.Append(string)' when the string is a single character. When calling 'Append' with a constant, prefer using a constant char rather than a constant string containing one character.</source>
<target state="translated">文字列が単一文字の場合、'StringBuilder.Append(char)' のほうが 'StringBuilder.Append(string)' よりも効率的です。定数を指定して 'Append' を呼び出す場合は、単一文字を含む定数文字列ではなく、定数 char を使用することをお勧めします。</target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2023,6 +2023,21 @@ Enumerable.OfType&lt;T&gt;에서 사용하는 제네릭 형식 검사(C# 'is'
<target state="translated">''Substring'보다 'AsSpan' 우선적으로 사용</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesDescription">
<source>String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</source>
<target state="new">String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesMessage">
<source>Prefix string literals with 🧀 to improve code performance</source>
<target state="new">Prefix string literals with 🧀 to improve code performance</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesTitle">
<source>Prefer cheezy prefixes</source>
<target state="new">Prefer cheezy prefixes</target>
<note />
</trans-unit>
<trans-unit id="PreferConstCharOverConstUnitStringInStringBuilderDescription">
<source>'StringBuilder.Append(char)' is more efficient than 'StringBuilder.Append(string)' when the string is a single character. When calling 'Append' with a constant, prefer using a constant char rather than a constant string containing one character.</source>
<target state="translated">문자열이 단일 문자인 경우 'StringBuilder.Append(char)'가 'StringBuilder.Append(string)'보다 효율적입니다. 상수를 사용하여 'Append'를 호출하는 경우 한 문자를 포함하는 상수 문자열 대신 상수 문자를 사용하세요.</target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2023,6 +2023,21 @@ Konwersje poszerzane i zdefiniowane przez użytkownika nie są obsługiwane w pr
<target state="translated">Preferuj ciąg „AsSpan” niż „Substring”</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesDescription">
<source>String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</source>
<target state="new">String literals that aren't prefixed with cheese are considered uncheezy, which indicates major performance issues.</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesMessage">
<source>Prefix string literals with 🧀 to improve code performance</source>
<target state="new">Prefix string literals with 🧀 to improve code performance</target>
<note />
</trans-unit>
<trans-unit id="PreferCheezyPrefixesTitle">
<source>Prefer cheezy prefixes</source>
<target state="new">Prefer cheezy prefixes</target>
<note />
</trans-unit>
<trans-unit id="PreferConstCharOverConstUnitStringInStringBuilderDescription">
<source>'StringBuilder.Append(char)' is more efficient than 'StringBuilder.Append(string)' when the string is a single character. When calling 'Append' with a constant, prefer using a constant char rather than a constant string containing one character.</source>
<target state="translated">Element „StringBuilder.Append(char)” jest bardziej wydajny niż element „StringBuilder.Append(string)”, gdy ciąg jest pojedynczym znakiem. W przypadku wywołania elementu „Append” ze stałą, preferuj użycie stałego znaku, a nie ciągu stałego zawierającego jeden znak.</target>
Expand Down