Skip to content

Commit 69a6ad3

Browse files
committed
Move "Benchmark class cannot be sealed" to Run analyzer
1 parent 55538ba commit 69a6ad3

File tree

8 files changed

+92
-115
lines changed

8 files changed

+92
-115
lines changed

src/BenchmarkDotNet.Analyzers/AnalyzerReleases.Unshipped.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Rule ID | Category | Severity | Notes
77
---------|----------|----------|--------------------
88
BDN1000 | Usage | Error | BDN1000_BenchmarkRunner_Run_TypeArgumentClassMissingBenchmarkMethods
99
BDN1001 | Usage | Error | BDN1001_BenchmarkRunner_Run_TypeArgumentClassMustBeNonAbstract
10+
BDN1002 | Usage | Error | BDN1002_BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed
1011
BDN1100 | Usage | Error | BDN1100_General_BenchmarkClass_MethodMustBePublic
1112
BDN1101 | Usage | Error | BDN1101_General_BenchmarkClass_MethodMustBeNonGeneric
1213
BDN1102 | Usage | Error | BDN1102_General_BenchmarkClass_ClassMustBePublic
@@ -15,8 +16,7 @@ BDN1104 | Usage | Error | BDN1104_General_BenchmarkClass_ClassMustBeNonAb
1516
BDN1105 | Usage | Error | BDN1105_General_BenchmarkClass_ClassMustBeNonGeneric
1617
BDN1106 | Usage | Error | BDN1106_General_BenchmarkClass_ClassWithGenericTypeArgumentsAttributeMustBeGeneric
1718
BDN1107 | Usage | Error | BDN1107_General_BenchmarkClass_GenericTypeArgumentsAttributeMustHaveMatchingTypeParameterCount
18-
BDN1108 | Usage | Error | BDN1108_General_BenchmarkClass_ClassMustBeUnsealed
19-
BDN1109 | Usage | Error | BDN1109_General_BenchmarkClass_OnlyOneMethodCanBeBaseline
19+
BDN1108 | Usage | Error | BDN1108_General_BenchmarkClass_OnlyOneMethodCanBeBaseline
2020
BDN1200 | Usage | Error | BDN1200_Attributes_GeneralParameterAttributes_MutuallyExclusiveOnField
2121
BDN1201 | Usage | Error | BDN1201_Attributes_GeneralParameterAttributes_MutuallyExclusiveOnProperty
2222
BDN1202 | Usage | Error | BDN1202_Attributes_GeneralParameterAttributes_FieldMustBePublic

src/BenchmarkDotNet.Analyzers/BenchmarkDotNetAnalyzerResources.Designer.cs

Lines changed: 27 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/BenchmarkDotNet.Analyzers/BenchmarkDotNetAnalyzerResources.resx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,13 @@
165165
<data name="General_BenchmarkClass_ClassMustBePublic_Title" xml:space="preserve">
166166
<value>Benchmark classes must be public</value>
167167
</data>
168-
<data name="General_BenchmarkClass_ClassMustBeUnsealed_Description" xml:space="preserve">
169-
<value>A benchmark class bust be unsealed</value>
168+
<data name="BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed_Description" xml:space="preserve">
169+
<value>A benchmark class referenced in the BenchmarkRunner.Run method must be unsealed</value>
170170
</data>
171-
<data name="General_BenchmarkClass_ClassMustBeUnsealed_MessageFormat" xml:space="preserve">
172-
<value>Benchmark class '{0}' cannot be sealed</value>
171+
<data name="BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed_MessageFormat" xml:space="preserve">
172+
<value>Referenced benchmark class '{0}' cannot be sealed</value>
173173
</data>
174-
<data name="General_BenchmarkClass_ClassMustBeUnsealed_Title" xml:space="preserve">
174+
<data name="BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed_Title" xml:space="preserve">
175175
<value>Benchmark classes must be unsealed</value>
176176
</data>
177177
<data name="General_BenchmarkClass_MethodMustBePublic_Description" xml:space="preserve">

src/BenchmarkDotNet.Analyzers/BenchmarkRunner/RunAnalyzer.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,19 @@ public class RunAnalyzer : DiagnosticAnalyzer
2626
isEnabledByDefault: true,
2727
description: AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.BenchmarkRunner_Run_TypeArgumentClassMustBeNonAbstract_Description)));
2828

29+
internal static readonly DiagnosticDescriptor TypeArgumentClassMustBeUnsealedRule = new DiagnosticDescriptor(DiagnosticIds.BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed,
30+
AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed_Title)),
31+
AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed_MessageFormat)),
32+
"Usage",
33+
DiagnosticSeverity.Error,
34+
isEnabledByDefault: true,
35+
description: AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed_Description)));
36+
2937
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
3038
[
3139
TypeArgumentClassMissingBenchmarkMethodsRule,
32-
TypeArgumentClassMustBeNonAbstractRule
40+
TypeArgumentClassMustBeNonAbstractRule,
41+
TypeArgumentClassMustBeUnsealedRule
3342
];
3443

3544
public override void Initialize(AnalysisContext analysisContext)
@@ -112,6 +121,11 @@ private static void Analyze(SyntaxNodeAnalysisContext context)
112121
ReportDiagnostic(TypeArgumentClassMustBeNonAbstractRule);
113122
}
114123

124+
if (benchmarkClassTypeSymbol.IsSealed)
125+
{
126+
ReportDiagnostic(TypeArgumentClassMustBeUnsealedRule);
127+
}
128+
115129
return;
116130

117131
bool HasBenchmarkAttribute()

src/BenchmarkDotNet.Analyzers/DiagnosticIds.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ public static class DiagnosticIds
44
{
55
public const string BenchmarkRunner_Run_TypeArgumentClassMissingBenchmarkMethods = "BDN1000";
66
public const string BenchmarkRunner_Run_TypeArgumentClassMustBeNonAbstract = "BDN1001";
7+
public const string BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed = "BDN1002";
78
public const string General_BenchmarkClass_MethodMustBePublic = "BDN1100";
89
public const string General_BenchmarkClass_MethodMustBeNonGeneric = "BDN1101";
910
public const string General_BenchmarkClass_ClassMustBePublic = "BDN1102";
@@ -12,8 +13,7 @@ public static class DiagnosticIds
1213
public const string General_BenchmarkClass_GenericClassMustBeAbstractOrAnnotatedWithAGenericTypeArgumentsAttribute = "BDN1105";
1314
public const string General_BenchmarkClass_ClassWithGenericTypeArgumentsAttributeMustBeGeneric = "BDN1106";
1415
public const string General_BenchmarkClass_GenericTypeArgumentsAttributeMustHaveMatchingTypeParameterCount = "BDN1107";
15-
public const string General_BenchmarkClass_ClassMustBeUnsealed = "BDN1108";
16-
public const string General_BenchmarkClass_OnlyOneMethodCanBeBaseline = "BDN1109";
16+
public const string General_BenchmarkClass_OnlyOneMethodCanBeBaseline = "BDN1108";
1717
public const string Attributes_GeneralParameterAttributes_MutuallyExclusiveOnField = "BDN1200";
1818
public const string Attributes_GeneralParameterAttributes_MutuallyExclusiveOnProperty = "BDN1201";
1919
public const string Attributes_GeneralParameterAttributes_FieldMustBePublic = "BDN1202";

src/BenchmarkDotNet.Analyzers/General/BenchmarkClassAnalyzer.cs

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,6 @@ public class BenchmarkClassAnalyzer : DiagnosticAnalyzer
7474
isEnabledByDefault: true,
7575
description: AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.General_BenchmarkClass_GenericTypeArgumentsAttributeMustHaveMatchingTypeParameterCount_Description)));
7676

77-
internal static readonly DiagnosticDescriptor ClassMustBeUnsealedRule = new DiagnosticDescriptor(DiagnosticIds.General_BenchmarkClass_ClassMustBeUnsealed,
78-
AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.General_BenchmarkClass_ClassMustBeUnsealed_Title)),
79-
AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.General_BenchmarkClass_ClassMustBeUnsealed_MessageFormat)),
80-
"Usage",
81-
DiagnosticSeverity.Error,
82-
isEnabledByDefault: true,
83-
description: AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.General_BenchmarkClass_ClassMustBeUnsealed_Description)));
84-
8577
internal static readonly DiagnosticDescriptor OnlyOneMethodCanBeBaselineRule = new DiagnosticDescriptor(DiagnosticIds.General_BenchmarkClass_OnlyOneMethodCanBeBaseline,
8678
AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.General_BenchmarkClass_OnlyOneMethodCanBeBaseline_Title)),
8779
AnalyzerHelper.GetResourceString(nameof(BenchmarkDotNetAnalyzerResources.General_BenchmarkClass_OnlyOneMethodCanBeBaseline_MessageFormat)),
@@ -99,7 +91,6 @@ public class BenchmarkClassAnalyzer : DiagnosticAnalyzer
9991
GenericClassMustBeAbstractOrAnnotatedWithAGenericTypeArgumentsAttributeRule,
10092
ClassWithGenericTypeArgumentsAttributeMustBeGenericRule,
10193
GenericTypeArgumentsAttributeMustHaveMatchingTypeParameterCountRule,
102-
ClassMustBeUnsealedRule,
10394
OnlyOneMethodCanBeBaselineRule
10495
];
10596

@@ -164,7 +155,6 @@ private static void Analyze(SyntaxNodeAnalysisContext context)
164155
var classIsPublic = false;
165156
var classStaticModifier = null as SyntaxToken?;
166157
var classAbstractModifier = null as SyntaxToken?;
167-
var classSealedModifier = null as SyntaxToken?;
168158

169159
foreach (var modifier in classDeclarationSyntax.Modifiers)
170160
{
@@ -180,10 +170,6 @@ private static void Analyze(SyntaxNodeAnalysisContext context)
180170
{
181171
classAbstractModifier = modifier;
182172
}
183-
else if (modifier.IsKind(SyntaxKind.SealedKeyword))
184-
{
185-
classSealedModifier = modifier;
186-
}
187173
}
188174

189175
if (genericTypeArgumentsAttributes.Length == 0)
@@ -230,11 +216,6 @@ private static void Analyze(SyntaxNodeAnalysisContext context)
230216
context.ReportDiagnostic(Diagnostic.Create(ClassMustBeNonStaticRule, classStaticModifier.Value.GetLocation(), classDeclarationSyntax.Identifier.ToString()));
231217
}
232218

233-
if (classSealedModifier.HasValue)
234-
{
235-
context.ReportDiagnostic(Diagnostic.Create(ClassMustBeUnsealedRule, classSealedModifier.Value.GetLocation(), classDeclarationSyntax.Identifier.ToString()));
236-
}
237-
238219
var baselineCount = 0;
239220
foreach (var benchmarkMethod in benchmarkMethods)
240221
{

0 commit comments

Comments
 (0)