66 using Microsoft . CodeAnalysis . Diagnostics ;
77
88 using System . Collections . Immutable ;
9+ using System . Linq ;
910
1011 [ DiagnosticAnalyzer ( LanguageNames . CSharp ) ]
1112 public class RunAnalyzer : DiagnosticAnalyzer
@@ -25,6 +26,14 @@ public class RunAnalyzer : DiagnosticAnalyzer
2526 DiagnosticSeverity . Error ,
2627 isEnabledByDefault : true ) ;
2728
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+
2837 internal static readonly DiagnosticDescriptor TypeArgumentClassMustBeNonAbstractRule = new DiagnosticDescriptor ( DiagnosticIds . BenchmarkRunner_Run_TypeArgumentClassMustBeNonAbstract ,
2938 AnalyzerHelper . GetResourceString ( nameof ( BenchmarkDotNetAnalyzerResources . BenchmarkRunner_Run_TypeArgumentClassMustBeNonAbstract_Title ) ) ,
3039 AnalyzerHelper . GetResourceString ( nameof ( BenchmarkDotNetAnalyzerResources . BenchmarkRunner_Run_TypeArgumentClassMustBeNonAbstract_MessageFormat ) ) ,
@@ -33,20 +42,22 @@ public class RunAnalyzer : DiagnosticAnalyzer
3342 isEnabledByDefault : true ,
3443 description : AnalyzerHelper . GetResourceString ( nameof ( BenchmarkDotNetAnalyzerResources . BenchmarkRunner_Run_TypeArgumentClassMustBeNonAbstract_Description ) ) ) ;
3544
36- internal static readonly DiagnosticDescriptor TypeArgumentClassMustBeUnsealedRule = new DiagnosticDescriptor ( DiagnosticIds . BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed ,
37- AnalyzerHelper . GetResourceString ( nameof ( BenchmarkDotNetAnalyzerResources . BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed_Title ) ) ,
38- AnalyzerHelper . GetResourceString ( nameof ( BenchmarkDotNetAnalyzerResources . BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed_MessageFormat ) ) ,
39- "Usage" ,
40- DiagnosticSeverity . Error ,
41- isEnabledByDefault : true ,
42- description : AnalyzerHelper . GetResourceString ( nameof ( BenchmarkDotNetAnalyzerResources . BenchmarkRunner_Run_TypeArgumentClassMustBeUnsealed_Description ) ) ) ;
45+ internal static readonly DiagnosticDescriptor GenericTypeArgumentClassMustBeAnnotatedWithAGenericTypeArgumentsAttributeRule = new DiagnosticDescriptor ( DiagnosticIds . BenchmarkRunner_Run_GenericTypeArgumentClassMustBeAnnotatedWithAGenericTypeArgumentsAttribute ,
46+ AnalyzerHelper . GetResourceString ( nameof ( BenchmarkDotNetAnalyzerResources . BenchmarkRunner_Run_GenericTypeArgumentClassMustBeAnnotatedWithAGenericTypeArgumentsAttribute_Title ) ) ,
47+ AnalyzerHelper . GetResourceString ( nameof ( BenchmarkDotNetAnalyzerResources . BenchmarkRunner_Run_GenericTypeArgumentClassMustBeAnnotatedWithAGenericTypeArgumentsAttribute_MessageFormat ) ) ,
48+ "Usage" ,
49+ DiagnosticSeverity . Error ,
50+ isEnabledByDefault : true ,
51+ description : AnalyzerHelper . GetResourceString ( nameof ( BenchmarkDotNetAnalyzerResources . BenchmarkRunner_Run_GenericTypeArgumentClassMustBeAnnotatedWithAGenericTypeArgumentsAttribute_Description ) ) ) ;
52+
4353
4454 public override ImmutableArray < DiagnosticDescriptor > SupportedDiagnostics =>
4555 [
4656 TypeArgumentClassMissingBenchmarkMethodsRule ,
4757 TypeArgumentClassMustBePublicRule ,
58+ TypeArgumentClassMustBeUnsealedRule ,
4859 TypeArgumentClassMustBeNonAbstractRule ,
49- TypeArgumentClassMustBeUnsealedRule
60+ GenericTypeArgumentClassMustBeAnnotatedWithAGenericTypeArgumentsAttributeRule ,
5061 ] ;
5162
5263 public override void Initialize ( AnalysisContext analysisContext )
@@ -143,8 +154,6 @@ private static void Analyze(SyntaxNodeAnalysisContext context)
143154 var benchmarkAttributeTypeSymbol = AnalyzerHelper . GetBenchmarkAttributeTypeSymbol ( context . Compilation ) ;
144155 if ( benchmarkAttributeTypeSymbol == null )
145156 {
146- ReportDiagnostic ( TypeArgumentClassMissingBenchmarkMethodsRule ) ;
147-
148157 return ;
149158 }
150159
@@ -168,6 +177,11 @@ private static void Analyze(SyntaxNodeAnalysisContext context)
168177 ReportDiagnostic ( TypeArgumentClassMustBeUnsealedRule ) ;
169178 }
170179
180+ if ( benchmarkClassTypeSymbol . IsUnboundGenericType && ! AnalyzerHelper . AttributeListContainsAttribute ( "BenchmarkDotNet.Attributes.GenericTypeArgumentsAttribute" , context . Compilation , benchmarkClassTypeSymbol . GetAttributes ( ) ) )
181+ {
182+ ReportDiagnostic ( GenericTypeArgumentClassMustBeAnnotatedWithAGenericTypeArgumentsAttributeRule ) ;
183+ }
184+
171185 return ;
172186
173187 bool HasBenchmarkAttribute ( )
0 commit comments