Skip to content

Commit

Permalink
chore: rename rule keys from ECXXX to GCIXXX
Browse files Browse the repository at this point in the history
  • Loading branch information
vincent314 committed Dec 10, 2024
1 parent c83fa10 commit e2b83d5
Show file tree
Hide file tree
Showing 39 changed files with 66 additions and 66 deletions.
28 changes: 14 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,20 +48,20 @@ EcoCode C# can use [SonarScanner for .Net](https://docs.sonarsource.com/sonarqub

|Id|Description|Severity|Code fix|
|--|-----------|:------:|:------:|
|[EC69](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC69/csharp/EC69.asciidoc)|Don’t call loop invariant functions in loop conditions|⚠️||
|[EC72](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC72/csharp/EC72.asciidoc)|Don’t execute SQL queries in loops|⚠️||
|[EC75](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC75/csharp/EC75.asciidoc)|Don’t concatenate `strings` in loops|⚠️||
|[EC81](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC81/csharp/EC81.asciidoc)|Specify `struct` layouts|⚠️|✔️|
|[EC82](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC82/csharp/EC82.asciidoc)|Variable can be made constant|ℹ️|✔️|
|[EC83](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC83/csharp/EC83.asciidoc)|Replace Enum `ToString()` with `nameof`|⚠️|✔️|
|[EC84](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC84/csharp/EC84.asciidoc)|Avoid `async void` methods|⚠️|✔️|
|[EC85](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC85/csharp/EC85.asciidoc)|Make type `sealed`|ℹ️|✔️|
|[EC86](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC86/csharp/EC86.asciidoc)|`GC.Collect` should not be called|⚠️||
|[EC87](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC87/csharp/EC87.asciidoc)|Use collection indexer|⚠️|✔️|
|[EC88](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC88/csharp/EC88.asciidoc)|Dispose resource asynchronously|⚠️|✔️|
|[EC91](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC91/csharp/EC91.asciidoc)|Use `Where` before `OrderBy`|⚠️|✔️|
|[EC92](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC92/csharp/EC92.asciidoc)|Use `Length` to test empty `strings`|⚠️|✔️|
|[EC93](https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC93/csharp/EC93.asciidoc)|Return `Task` directly|ℹ️|✔️|
|[GCI69](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI69/csharp/GCI69.asciidoc)|Don’t call loop invariant functions in loop conditions|⚠️||
|[GCI72](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI72/csharp/GCI72.asciidoc)|Don’t execute SQL queries in loops|⚠️||
|[GCI75](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI75/csharp/GCI75.asciidoc)|Don’t concatenate `strings` in loops|⚠️||
|[GCI81](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI81/csharp/GCI81.asciidoc)|Specify `struct` layouts|⚠️|✔️|
|[GCI82](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI82/csharp/GCI82.asciidoc)|Variable can be made constant|ℹ️|✔️|
|[GCI83](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI83/csharp/GCI83.asciidoc)|Replace Enum `ToString()` with `nameof`|⚠️|✔️|
|[GCI84](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI84/csharp/GCI84.asciidoc)|Avoid `async void` methods|⚠️|✔️|
|[GCI85](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI85/csharp/GCI85.asciidoc)|Make type `sealed`|ℹ️|✔️|
|[GCI86](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI86/csharp/GCI86.asciidoc)|`GC.Collect` should not be called|⚠️||
|[GCI87](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI87/csharp/GCI87.asciidoc)|Use collection indexer|⚠️|✔️|
|[GCI88](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI88/csharp/GCI88.asciidoc)|Dispose resource asynchronously|⚠️|✔️|
|[GCI91](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI91/csharp/GCI91.asciidoc)|Use `Where` before `OrderBy`|⚠️|✔️|
|[GCI92](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI92/csharp/GCI92.asciidoc)|Use `Length` to test empty `strings`|⚠️|✔️|
|[GCI93](https://github.com/green-code-initiative/creedengo-rules-specifications/blob/main/src/main/rules/GCI93/csharp/GCI93.asciidoc)|Return `Task` directly|ℹ️|✔️|

🌿 Customized Roslyn Rules
-------------------
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC69: Don't call loop invariant functions in loop conditions.</summary>
/// <summary>GCI69: Don't call loop invariant functions in loop conditions.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class DontCallFunctionsInLoopConditions : DiagnosticAnalyzer
{
Expand All @@ -11,7 +11,7 @@ public sealed class DontCallFunctionsInLoopConditions : DiagnosticAnalyzer

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC69_DontCallFunctionsInLoopConditions,
id: Rule.Ids.GCI69_DontCallFunctionsInLoopConditions,
title: "Don't call loop invariant functions in loop conditions",
message: "A loop invariant function is called in a loop condition",
category: Rule.Categories.Performance,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
namespace EcoCode.Analyzers;

/// <summary>EC72: Don't execute SQL commands in loops.</summary>
/// <summary>GCI72: Don't execute SQL commands in loops.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class DontExecuteSqlCommandsInLoops : DiagnosticAnalyzer
{
private static readonly ImmutableArray<SyntaxKind> Invocations = [SyntaxKind.InvocationExpression];

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC72_DontExecuteSqlCommandsInLoops,
id: Rule.Ids.GCI72_DontExecuteSqlCommandsInLoops,
title: "Don't execute SQL commands in loops",
message: "A SQL command is executed in a loop",
category: Rule.Categories.Performance,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC75: Don't concatenate strings in loops.</summary>
/// <summary>GCI75: Don't concatenate strings in loops.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class DontConcatenateStringsInLoops : DiagnosticAnalyzer
{
Expand All @@ -13,7 +13,7 @@ public sealed class DontConcatenateStringsInLoops : DiagnosticAnalyzer

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC75_DontConcatenateStringsInLoops,
id: Rule.Ids.GCI75_DontConcatenateStringsInLoops,
title: "Don't concatenate strings in loops",
message: "A string is concatenated in a loop",
category: Rule.Categories.Performance,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace EcoCode.Analyzers;

/// <summary>EC81 fixer: Use struct layout.</summary>
/// <summary>GCI81 fixer: Use struct layout.</summary>
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(SpecifyStructLayoutFixer)), Shared]
public sealed class SpecifyStructLayoutFixer : CodeFixProvider
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
namespace EcoCode.Analyzers;

/// <summary>EC81: Specify struct layout.</summary>
/// <summary>GCI81: Specify struct layout.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class SpecifyStructLayout : DiagnosticAnalyzer
{
private static readonly ImmutableArray<SymbolKind> SymbolKinds = [SymbolKind.NamedType];

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC81_UseStructLayout,
id: Rule.Ids.GCI81_UseStructLayout,
title: "Use struct layout",
message: "Use struct layout",
category: Rule.Categories.Performance,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC82 dixer: Variable can be made constant.</summary>
/// <summary>GCI82 dixer: Variable can be made constant.</summary>
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(VariableCanBeMadeConstantFixer)), Shared]
public sealed class VariableCanBeMadeConstantFixer : CodeFixProvider
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
namespace EcoCode.Analyzers;

/// <summary>EC82: Variable can be made constant.</summary>
/// <summary>GCI82: Variable can be made constant.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class VariableCanBeMadeConstant : DiagnosticAnalyzer
{
private static readonly ImmutableArray<SyntaxKind> SyntaxKinds = [SyntaxKind.LocalDeclarationStatement];

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC82_VariableCanBeMadeConstant,
id: Rule.Ids.GCI82_VariableCanBeMadeConstant,
title: "Variable can be made constant",
message: "A variable can be made constant",
category: Rule.Categories.Usage,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC83 fixer: Replace enum ToString with nameof.</summary>
/// <summary>GCI83 fixer: Replace enum ToString with nameof.</summary>
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(ReplaceEnumToStringWithNameOfFixer)), Shared]
public sealed class ReplaceEnumToStringWithNameOfFixer : CodeFixProvider
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC83: Replace enum ToString with nameof.</summary>
/// <summary>GCI83: Replace enum ToString with nameof.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class ReplaceEnumToStringWithNameOf : DiagnosticAnalyzer
{
Expand All @@ -9,7 +9,7 @@ public sealed class ReplaceEnumToStringWithNameOf : DiagnosticAnalyzer

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC83_ReplaceEnumToStringWithNameOf,
id: Rule.Ids.GCI83_ReplaceEnumToStringWithNameOf,
title: "Replace enum ToString with nameof",
message: "Enum.ToString() can be replaced with nameof()",
category: Rule.Categories.Performance,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC84 fixer: Avoid async void methods.</summary>
/// <summary>GCI84 fixer: Avoid async void methods.</summary>
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(AvoidAsyncVoidMethodsFixer)), Shared]
public sealed class AvoidAsyncVoidMethodsFixer : CodeFixProvider
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
namespace EcoCode.Analyzers;

/// <summary>EC84: Avoid async void methods.</summary>
/// <summary>GCI84: Avoid async void methods.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class AvoidAsyncVoidMethods : DiagnosticAnalyzer
{
private static readonly ImmutableArray<SyntaxKind> Declarations = [SyntaxKind.MethodDeclaration];

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC84_AvoidAsyncVoidMethods,
id: Rule.Ids.GCI84_AvoidAsyncVoidMethods,
title: "Avoid async void methods",
message: "Avoid async void methods",
category: Rule.Categories.Design,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

namespace EcoCode.Analyzers;

/// <summary>EC85: Make type sealed.</summary>
/// <summary>GCI85: Make type sealed.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class MakeTypeSealed : DiagnosticAnalyzer
{
private static readonly ImmutableArray<SymbolKind> SymbolKinds = [SymbolKind.NamedType];

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC85_MakeTypeSealed,
id: Rule.Ids.GCI85_MakeTypeSealed,
title: "Make type sealed",
message: "Type may be sealed, as it has no subtypes in its assembly and no user-declared overridable member",
category: Rule.Categories.Performance,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
namespace EcoCode.Analyzers;

/// <summary>EC86 : GC Collect should not be called.</summary>
/// <summary>GCI86 : GC Collect should not be called.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class GCCollectShouldNotBeCalled : DiagnosticAnalyzer
{
private static readonly ImmutableArray<SyntaxKind> SyntaxKinds = [SyntaxKind.InvocationExpression];

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC86_GCCollectShouldNotBeCalled,
id: Rule.Ids.GCI86_GCCollectShouldNotBeCalled,
title: "Avoid calling GC.Collect() method",
message: "Avoid calling GC.Collect() method",
category: Rule.Categories.Performance,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace EcoCode.Analyzers;

/// <summary>EC87 fixer: Use list indexer.</summary>
/// <summary>GCI87 fixer: Use list indexer.</summary>
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(UseListIndexerFixer)), Shared]
public sealed class UseListIndexerFixer : CodeFixProvider
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

namespace EcoCode.Analyzers;

/// <summary>EC87: Use list indexer.</summary>
/// <summary>GCI87: Use list indexer.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class UseListIndexer : DiagnosticAnalyzer
{
private static readonly ImmutableArray<SyntaxKind> SyntaxKinds = [SyntaxKind.InvocationExpression];

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC87_UseCollectionIndexer,
id: Rule.Ids.GCI87_UseCollectionIndexer,
title: "Use list indexer",
message: "A list indexer should be used instead of a Linq method",
category: Rule.Categories.Performance,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC88 fixer: Dispose resource asynchronously.</summary>
/// <summary>GCI88 fixer: Dispose resource asynchronously.</summary>
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(DisposeResourceAsynchronouslyFixer)), Shared]
public sealed class DisposeResourceAsynchronouslyFixer : CodeFixProvider
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC88: Dispose resource asynchronously.</summary>
/// <summary>GCI88: Dispose resource asynchronously.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class DisposeResourceAsynchronously : DiagnosticAnalyzer
{
Expand All @@ -9,7 +9,7 @@ public sealed class DisposeResourceAsynchronously : DiagnosticAnalyzer

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC88_DisposeResourceAsynchronously,
id: Rule.Ids.GCI88_DisposeResourceAsynchronously,
title: "Dispose resource asynchronously",
message: "A resource can be disposed asynchronously",
category: Rule.Categories.Usage,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC91 fixer: Use Where before OrderBy.</summary>
/// <summary>GCI91 fixer: Use Where before OrderBy.</summary>
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(UseWhereBeforeOrderByFixer)), Shared]
public sealed class UseWhereBeforeOrderByFixer : CodeFixProvider
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC91: Use Where before OrderBy.</summary>
/// <summary>GCI91: Use Where before OrderBy.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class UseWhereBeforeOrderBy : DiagnosticAnalyzer
{
Expand All @@ -9,7 +9,7 @@ public sealed class UseWhereBeforeOrderBy : DiagnosticAnalyzer

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC91_UseWhereBeforeOrderBy,
id: Rule.Ids.GCI91_UseWhereBeforeOrderBy,
title: "Use Where before OrderBy",
message: "Call Where before OrderBy in a LINQ method chain",
category: Rule.Categories.Usage,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC92 fixer: Use Length to test empty strings.</summary>
/// <summary>GCI92 fixer: Use Length to test empty strings.</summary>
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(UseLengthToTestEmptyStringsFixer)), Shared]
public sealed class UseLengthToTestEmptyStringsFixer : CodeFixProvider
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC92: Use Length to test empty strings.</summary>
/// <summary>GCI92: Use Length to test empty strings.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class UseLengthToTestEmptyStrings : DiagnosticAnalyzer
{
Expand All @@ -9,7 +9,7 @@ public sealed class UseLengthToTestEmptyStrings : DiagnosticAnalyzer

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC92_UseStringEmptyLength,
id: Rule.Ids.GCI92_UseStringEmptyLength,
title: "Use Length to test empty strings",
message: "Use string.Length instead of comparison with empty string",
category: Rule.Categories.Usage,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace EcoCode.Analyzers;

/// <summary>EC93 fixer: Return Task directly.</summary>
/// <summary>GCI93 fixer: Return Task directly.</summary>
[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(ReturnTaskDirectly)), Shared]
public sealed class ReturnTaskDirectlyFixer : CodeFixProvider
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
namespace EcoCode.Analyzers;

/// <summary>EC93: Return Task directly.</summary>
/// <summary>GCI93: Return Task directly.</summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class ReturnTaskDirectly : DiagnosticAnalyzer
{
private static readonly ImmutableArray<SyntaxKind> MethodDeclarations = [SyntaxKind.MethodDeclaration];

/// <summary>The diagnostic descriptor.</summary>
public static DiagnosticDescriptor Descriptor { get; } = Rule.CreateDescriptor(
id: Rule.Ids.EC93_ReturnTaskDirectly,
id: Rule.Ids.GCI93_ReturnTaskDirectly,
title: "Consider returning Task directly",
message: "Consider returning a Task directly instead of awaiting a single statement",
category: Rule.Categories.Performance,
Expand Down
Loading

0 comments on commit e2b83d5

Please sign in to comment.