Skip to content

Commit 67e6c5f

Browse files
CopilotandrewlockCopilot
authored
Disable usage analyzers by default, enable via editorconfig (#214)
* Initial plan * Add config helper and update all usage analyzers to respect enable flag Co-authored-by: andrewlock <18755388+andrewlock@users.noreply.github.com> * Update all usage analyzer tests with config support and add disabled tests Co-authored-by: andrewlock <18755388+andrewlock@users.noreply.github.com> * Fix analyzer config key format and update tests Co-authored-by: andrewlock <18755388+andrewlock@users.noreply.github.com> * Add analyzer config to all test helper methods Co-authored-by: andrewlock <18755388+andrewlock@users.noreply.github.com> * Make tweaks including tags * Add base type for tests to make it easier * Fix invalid test * Fix AnalyzerTests * Update tests/NetEscapades.EnumGenerators.Tests/AnalyzerTestsBase.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix compilation --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: andrewlock <18755388+andrewlock@users.noreply.github.com> Co-authored-by: Andrew Lock <andrewlock.net@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent a17549f commit 67e6c5f

20 files changed

Lines changed: 623 additions & 315 deletions

src/NetEscapades.EnumGenerators/Diagnostics/UsageAnalyzers/GetNamesAnalyzer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ public class GetNamesAnalyzer : DiagnosticAnalyzer
2121
isEnabledByDefault: true);
2222

2323
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
24-
=> ImmutableArray.Create(Rule);
24+
=> ImmutableArray.Create(Rule, UsageAnalyzerConfig.ConfigDescriptor);
2525

2626
public override void Initialize(AnalysisContext context)
2727
{
2828
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
2929
context.EnableConcurrentExecution();
3030
context.RegisterCompilationStartAction(ctx =>
3131
{
32+
if (!UsageAnalyzerConfig.IsEnabled(ctx.Options))
33+
{
34+
return;
35+
}
36+
3237
var (enumExtensionsAttr, externalEnumTypes) = AnalyzerHelpers.GetEnumExtensionAttributes(ctx.Compilation);
3338
if (enumExtensionsAttr is null || externalEnumTypes is null)
3439
{

src/NetEscapades.EnumGenerators/Diagnostics/UsageAnalyzers/GetValuesAnalyzer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ public class GetValuesAnalyzer : DiagnosticAnalyzer
2121
isEnabledByDefault: true);
2222

2323
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
24-
=> ImmutableArray.Create(Rule);
24+
=> ImmutableArray.Create(Rule, UsageAnalyzerConfig.ConfigDescriptor);
2525

2626
public override void Initialize(AnalysisContext context)
2727
{
2828
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
2929
context.EnableConcurrentExecution();
3030
context.RegisterCompilationStartAction(ctx =>
3131
{
32+
if (!UsageAnalyzerConfig.IsEnabled(ctx.Options))
33+
{
34+
return;
35+
}
36+
3237
var (enumExtensionsAttr, externalEnumTypes) = AnalyzerHelpers.GetEnumExtensionAttributes(ctx.Compilation);
3338
if (enumExtensionsAttr is null || externalEnumTypes is null)
3439
{

src/NetEscapades.EnumGenerators/Diagnostics/UsageAnalyzers/GetValuesAsUnderlyingTypeAnalyzer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ public class GetValuesAsUnderlyingTypeAnalyzer : DiagnosticAnalyzer
2121
isEnabledByDefault: true);
2222

2323
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
24-
=> ImmutableArray.Create(Rule);
24+
=> ImmutableArray.Create(Rule, UsageAnalyzerConfig.ConfigDescriptor);
2525

2626
public override void Initialize(AnalysisContext context)
2727
{
2828
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
2929
context.EnableConcurrentExecution();
3030
context.RegisterCompilationStartAction(ctx =>
3131
{
32+
if (!UsageAnalyzerConfig.IsEnabled(ctx.Options))
33+
{
34+
return;
35+
}
36+
3237
var (enumExtensionsAttr, externalEnumTypes) = AnalyzerHelpers.GetEnumExtensionAttributes(ctx.Compilation);
3338
if (enumExtensionsAttr is null || externalEnumTypes is null)
3439
{

src/NetEscapades.EnumGenerators/Diagnostics/UsageAnalyzers/HasFlagAnalyzer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ public class HasFlagAnalyzer : DiagnosticAnalyzer
2121
isEnabledByDefault: true);
2222

2323
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
24-
=> ImmutableArray.Create(Rule);
24+
=> ImmutableArray.Create(Rule, UsageAnalyzerConfig.ConfigDescriptor);
2525

2626
public override void Initialize(AnalysisContext context)
2727
{
2828
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
2929
context.EnableConcurrentExecution();
3030
context.RegisterCompilationStartAction(ctx =>
3131
{
32+
if (!UsageAnalyzerConfig.IsEnabled(ctx.Options))
33+
{
34+
return;
35+
}
36+
3237
var (enumExtensionsAttr, externalEnumTypes) = AnalyzerHelpers.GetEnumExtensionAttributes(ctx.Compilation);
3338
if (enumExtensionsAttr is null || externalEnumTypes is null)
3439
{

src/NetEscapades.EnumGenerators/Diagnostics/UsageAnalyzers/IsDefinedAnalyzer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ public class IsDefinedAnalyzer : DiagnosticAnalyzer
2121
isEnabledByDefault: true);
2222

2323
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
24-
=> ImmutableArray.Create(Rule);
24+
=> ImmutableArray.Create(Rule, UsageAnalyzerConfig.ConfigDescriptor);
2525

2626
public override void Initialize(AnalysisContext context)
2727
{
2828
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
2929
context.EnableConcurrentExecution();
3030
context.RegisterCompilationStartAction(ctx =>
3131
{
32+
if (!UsageAnalyzerConfig.IsEnabled(ctx.Options))
33+
{
34+
return;
35+
}
36+
3237
var (enumExtensionsAttr, externalEnumTypes) = AnalyzerHelpers.GetEnumExtensionAttributes(ctx.Compilation);
3338
if (enumExtensionsAttr is null || externalEnumTypes is null)
3439
{

src/NetEscapades.EnumGenerators/Diagnostics/UsageAnalyzers/ParseAnalyzer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ public class ParseAnalyzer : DiagnosticAnalyzer
2121
isEnabledByDefault: true);
2222

2323
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
24-
=> ImmutableArray.Create(Rule);
24+
=> ImmutableArray.Create(Rule, UsageAnalyzerConfig.ConfigDescriptor);
2525

2626
public override void Initialize(AnalysisContext context)
2727
{
2828
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
2929
context.EnableConcurrentExecution();
3030
context.RegisterCompilationStartAction(ctx =>
3131
{
32+
if (!UsageAnalyzerConfig.IsEnabled(ctx.Options))
33+
{
34+
return;
35+
}
36+
3237
var (enumExtensionsAttr, externalEnumTypes) = AnalyzerHelpers.GetEnumExtensionAttributes(ctx.Compilation);
3338
if (enumExtensionsAttr is null || externalEnumTypes is null)
3439
{

src/NetEscapades.EnumGenerators/Diagnostics/UsageAnalyzers/ToStringAnalyzer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ public class ToStringAnalyzer : DiagnosticAnalyzer
2121
isEnabledByDefault: true);
2222

2323
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
24-
=> ImmutableArray.Create(Rule);
24+
=> ImmutableArray.Create(Rule, UsageAnalyzerConfig.ConfigDescriptor);
2525

2626
public override void Initialize(AnalysisContext context)
2727
{
2828
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
2929
context.EnableConcurrentExecution();
3030
context.RegisterCompilationStartAction(ctx =>
3131
{
32+
if (!UsageAnalyzerConfig.IsEnabled(ctx.Options))
33+
{
34+
return;
35+
}
36+
3237
var (enumExtensionsAttr, externalEnumTypes) = AnalyzerHelpers.GetEnumExtensionAttributes(ctx.Compilation);
3338
if (enumExtensionsAttr is null || externalEnumTypes is null)
3439
{

src/NetEscapades.EnumGenerators/Diagnostics/UsageAnalyzers/TryParseAnalyzer.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ public class TryParseAnalyzer : DiagnosticAnalyzer
2121
isEnabledByDefault: true);
2222

2323
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
24-
=> ImmutableArray.Create(Rule);
24+
=> ImmutableArray.Create(Rule, UsageAnalyzerConfig.ConfigDescriptor);
2525

2626
public override void Initialize(AnalysisContext context)
2727
{
2828
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
2929
context.EnableConcurrentExecution();
3030
context.RegisterCompilationStartAction(ctx =>
3131
{
32+
if (!UsageAnalyzerConfig.IsEnabled(ctx.Options))
33+
{
34+
return;
35+
}
36+
3237
var (enumExtensionsAttr, externalEnumTypes) = AnalyzerHelpers.GetEnumExtensionAttributes(ctx.Compilation);
3338
if (enumExtensionsAttr is null || externalEnumTypes is null)
3439
{
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using Microsoft.CodeAnalysis;
2+
using Microsoft.CodeAnalysis.Diagnostics;
3+
4+
namespace NetEscapades.EnumGenerators.Diagnostics.UsageAnalyzers;
5+
6+
public static class UsageAnalyzerConfig
7+
{
8+
public const string EnableKey = "netescapades.enumgenerators.usage_analyzers.enable";
9+
10+
internal static readonly DiagnosticDescriptor ConfigDescriptor = new(
11+
#pragma warning disable RS2008 // Enable Analyzer Release Tracking
12+
id: "NEEGCONFIG001",
13+
#pragma warning restore RS2008
14+
title: "Enable callsite analyzers for generated enum extensions",
15+
messageFormat:
16+
"Enable analyzers to encourage use of generated extension methods instead of System.Enum methods",
17+
category: "Configuration",
18+
defaultSeverity: DiagnosticSeverity.Hidden,
19+
isEnabledByDefault: true,
20+
customTags:
21+
[
22+
"EditorConfigOption",
23+
"EditorConfigOptionKey=netescapades.enumgenerators.usage_analyzers.enable",
24+
"EditorConfigOptionDescription=Enable callsite analyzers for generated enum extensions",
25+
"EditorConfigOptionAllowedValues=true,false",
26+
"EditorConfigOptionDefault=false",
27+
WellKnownDiagnosticTags.NotConfigurable
28+
]);
29+
30+
internal static bool IsEnabled(AnalyzerOptions context)
31+
=> context.AnalyzerConfigOptionsProvider.GlobalOptions.TryGetValue(EnableKey, out var value) &&
32+
bool.TryParse(value, out var isEnabled)
33+
&& isEnabled;
34+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
is_global = true
2+
netescapades.enumgenerators.usage_analyzers.enable = true

0 commit comments

Comments
 (0)