Skip to content

Commit 664553f

Browse files
committed
Removed cached delegates (the compiler does it since C# 11)
1 parent 0c3e9cd commit 664553f

File tree

56 files changed

+210
-505
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+210
-505
lines changed

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<IncludeBuildOutput>false</IncludeBuildOutput>
66
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
77
<BaseOutputPath>$(SolutionDir)..\bin</BaseOutputPath>
8+
<NoWarn>$(NoWarn);RS1012</NoWarn>
89
</PropertyGroup>
910

1011
<PropertyGroup>
Lines changed: 94 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,128 @@
11
using System;
2+
using System.Collections.Immutable;
23
using System.Linq;
34
using JetBrains.Annotations;
5+
using Microsoft.CodeAnalysis;
6+
using Microsoft.CodeAnalysis.CSharp;
47
using Microsoft.CodeAnalysis.Diagnostics;
58

69
namespace CSharpGuidelinesAnalyzer.Extensions;
710

8-
/// <summary />
11+
/// <summary>
12+
/// Replaces the built-in registration methods to not run on broken code.
13+
/// </summary>
914
internal static class AnalysisContextExtensions
1015
{
11-
public static void SkipInvalid(this OperationAnalysisContext context, [NotNull] Action<OperationAnalysisContext> action)
16+
public static void SafeRegisterOperationAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<OperationAnalysisContext> action,
17+
[NotNull] params OperationKind[] operationKinds)
18+
{
19+
analysisContext.RegisterOperationAction(context => SkipInvalid(context, action), operationKinds);
20+
}
21+
22+
public static void SafeRegisterOperationAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<OperationAnalysisContext> action,
23+
ImmutableArray<OperationKind> operationKinds)
24+
{
25+
analysisContext.RegisterOperationAction(context => SkipInvalid(context, action), operationKinds);
26+
}
27+
28+
public static void SafeRegisterOperationBlockAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<OperationBlockAnalysisContext> action)
29+
{
30+
analysisContext.RegisterOperationBlockAction(context => SkipInvalid(context, action));
31+
}
32+
33+
public static void SafeRegisterSymbolAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<SymbolAnalysisContext> action,
34+
[NotNull] params SymbolKind[] symbolKinds)
35+
{
36+
analysisContext.RegisterSymbolAction(context => SkipEmptyName(context, action), symbolKinds);
37+
}
38+
39+
public static void SafeRegisterSymbolAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<SymbolAnalysisContext> action,
40+
ImmutableArray<SymbolKind> symbolKinds)
41+
{
42+
analysisContext.RegisterSymbolAction(context => SkipEmptyName(context, action), symbolKinds);
43+
}
44+
45+
public static void SafeRegisterSyntaxNodeAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<SymbolAnalysisContext> action,
46+
[NotNull] params SyntaxKind[] syntaxKinds)
47+
{
48+
analysisContext.RegisterSyntaxNodeAction(context => SkipEmptyName(context, action), syntaxKinds);
49+
}
50+
51+
public static void SafeRegisterSyntaxNodeAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<SymbolAnalysisContext> action,
52+
ImmutableArray<SyntaxKind> syntaxKinds)
53+
{
54+
analysisContext.RegisterSyntaxNodeAction(context => SkipEmptyName(context, action), syntaxKinds);
55+
}
56+
57+
public static void SafeRegisterOperationAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
58+
[NotNull] Action<OperationAnalysisContext> action, [NotNull] params OperationKind[] operationKinds)
59+
{
60+
compilationStartAnalysisContext.RegisterOperationAction(context => SkipInvalid(context, action), operationKinds);
61+
}
62+
63+
public static void SafeRegisterOperationAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
64+
[NotNull] Action<OperationAnalysisContext> action, ImmutableArray<OperationKind> operationKinds)
65+
{
66+
compilationStartAnalysisContext.RegisterOperationAction(context => SkipInvalid(context, action), operationKinds);
67+
}
68+
69+
public static void SafeRegisterOperationBlockAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
70+
[NotNull] Action<OperationBlockAnalysisContext> action)
71+
{
72+
compilationStartAnalysisContext.RegisterOperationBlockAction(context => SkipInvalid(context, action));
73+
}
74+
75+
public static void SafeRegisterSymbolAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
76+
[NotNull] Action<SymbolAnalysisContext> action, [NotNull] params SymbolKind[] symbolKinds)
77+
{
78+
compilationStartAnalysisContext.RegisterSymbolAction(context => SkipEmptyName(context, action), symbolKinds);
79+
}
80+
81+
public static void SafeRegisterSymbolAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
82+
[NotNull] Action<SymbolAnalysisContext> action, ImmutableArray<SymbolKind> symbolKinds)
83+
{
84+
compilationStartAnalysisContext.RegisterSymbolAction(context => SkipEmptyName(context, action), symbolKinds);
85+
}
86+
87+
public static void SafeRegisterSyntaxNodeAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
88+
[NotNull] Action<SymbolAnalysisContext> action, [NotNull] params SyntaxKind[] syntaxKinds)
89+
{
90+
compilationStartAnalysisContext.RegisterSyntaxNodeAction(context => SkipEmptyName(context, action), syntaxKinds);
91+
}
92+
93+
public static void SafeRegisterSyntaxNodeAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
94+
[NotNull] Action<SymbolAnalysisContext> action, ImmutableArray<SyntaxKind> syntaxKinds)
95+
{
96+
compilationStartAnalysisContext.RegisterSyntaxNodeAction(context => SkipEmptyName(context, action), syntaxKinds);
97+
}
98+
99+
private static void SkipInvalid(OperationAnalysisContext context, [NotNull] Action<OperationAnalysisContext> action)
12100
{
13101
if (!context.Operation.HasErrors(context.Compilation, context.CancellationToken))
14102
{
15103
action(context);
16104
}
17105
}
18106

19-
public static void SkipInvalid(this OperationBlockAnalysisContext context, [NotNull] Action<OperationBlockAnalysisContext> action)
107+
private static void SkipInvalid(OperationBlockAnalysisContext context, [NotNull] Action<OperationBlockAnalysisContext> action)
20108
{
21109
if (!context.OperationBlocks.Any(block => block.HasErrors(context.Compilation, context.CancellationToken)))
22110
{
23111
action(context);
24112
}
25113
}
26114

27-
public static void SkipEmptyName(this SymbolAnalysisContext context, [NotNull] Action<SymbolAnalysisContext> action)
115+
private static void SkipEmptyName(SymbolAnalysisContext context, [NotNull] Action<SymbolAnalysisContext> action)
28116
{
29117
if (!string.IsNullOrEmpty(context.Symbol.Name))
30118
{
31119
action(context);
32120
}
33121
}
34122

35-
public static void SkipEmptyName(this SyntaxNodeAnalysisContext context, [NotNull] Action<SymbolAnalysisContext> action)
123+
private static void SkipEmptyName(SyntaxNodeAnalysisContext context, [NotNull] Action<SymbolAnalysisContext> action)
36124
{
37125
SymbolAnalysisContext symbolContext = context.ToSymbolContext();
38-
symbolContext.SkipEmptyName(_ => action(symbolContext));
126+
SkipEmptyName(symbolContext, _ => action(symbolContext));
39127
}
40128
}

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/ClassDesign/AvoidStaticClassAnalyzer.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@ public sealed class AvoidStaticClassAnalyzer : DiagnosticAnalyzer
3131
private static readonly DiagnosticDescriptor MemberRule = new(DiagnosticId, Title, MemberMessageFormat, Category.DisplayName, DiagnosticSeverity.Info, true,
3232
Description, Category.GetHelpLinkUri(DiagnosticId));
3333

34-
[NotNull]
35-
private static readonly Action<SymbolAnalysisContext> AnalyzeNamedTypeAction = context => context.SkipEmptyName(AnalyzeNamedType);
36-
3734
[ItemNotNull]
3835
private static readonly ImmutableArray<string> PlatformInvokeWrapperTypeNames =
3936
ImmutableArray.Create("NativeMethods", "SafeNativeMethods", "UnsafeNativeMethods");
@@ -46,7 +43,7 @@ public override void Initialize([NotNull] AnalysisContext context)
4643
context.EnableConcurrentExecution();
4744
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
4845

49-
context.RegisterSymbolAction(AnalyzeNamedTypeAction, SymbolKind.NamedType);
46+
context.SafeRegisterSymbolAction(AnalyzeNamedType, SymbolKind.NamedType);
5047
}
5148

5249
private static void AnalyzeNamedType(SymbolAnalysisContext context)

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/ClassDesign/DoNotHideInheritedMemberAnalyzer.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.Collections.Immutable;
32
using CSharpGuidelinesAnalyzer.Extensions;
43
using JetBrains.Annotations;
@@ -26,9 +25,6 @@ public sealed class DoNotHideInheritedMemberAnalyzer : DiagnosticAnalyzer
2625
private static readonly ImmutableArray<SymbolKind> MemberSymbolKinds = ImmutableArray.Create(SymbolKind.Field,
2726
SymbolKind.Property, SymbolKind.Method, SymbolKind.Event, SymbolKind.NamedType);
2827

29-
[NotNull]
30-
private static readonly Action<SymbolAnalysisContext> AnalyzeMemberAction = context => context.SkipEmptyName(AnalyzeMember);
31-
3228
[ItemNotNull]
3329
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
3430

@@ -37,7 +33,7 @@ public override void Initialize([NotNull] AnalysisContext context)
3733
context.EnableConcurrentExecution();
3834
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
3935

40-
context.RegisterSymbolAction(AnalyzeMemberAction, MemberSymbolKinds);
36+
context.SafeRegisterSymbolAction(AnalyzeMember, MemberSymbolKinds);
4137
}
4238

4339
private static void AnalyzeMember(SymbolAnalysisContext context)

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/ClassDesign/TypeShouldHaveASinglePurposeAnalyzer.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.Collections.Immutable;
32
using CSharpGuidelinesAnalyzer.Extensions;
43
using JetBrains.Annotations;
@@ -26,9 +25,6 @@ public sealed class TypeShouldHaveASinglePurposeAnalyzer : DiagnosticAnalyzer
2625
private static readonly DiagnosticDescriptor Rule = new(DiagnosticId, Title, MessageFormat, Category.DisplayName, DiagnosticSeverity.Warning, true,
2726
Description, Category.GetHelpLinkUri(DiagnosticId));
2827

29-
[NotNull]
30-
private static readonly Action<SyntaxNodeAnalysisContext> AnalyzeTypeDeclarationAction = AnalyzeTypeDeclaration;
31-
3228
[NotNull]
3329
private static readonly SyntaxKind[] TypeDeclarationKinds =
3430
[
@@ -50,7 +46,7 @@ public override void Initialize([NotNull] AnalysisContext context)
5046
context.EnableConcurrentExecution();
5147
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
5248

53-
context.RegisterSyntaxNodeAction(AnalyzeTypeDeclarationAction, TypeDeclarationKinds);
49+
context.RegisterSyntaxNodeAction(AnalyzeTypeDeclaration, TypeDeclarationKinds);
5450
}
5551

5652
private static void AnalyzeTypeDeclaration(SyntaxNodeAnalysisContext context)

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Documentation/AvoidInlineCommentAnalyzer.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.Collections.Immutable;
32
using System.Linq;
43
using JetBrains.Annotations;
@@ -28,9 +27,6 @@ public sealed class AvoidInlineCommentAnalyzer : DiagnosticAnalyzer
2827
[ItemNotNull]
2928
private static readonly ImmutableArray<string> ArrangeActAssertLines = ImmutableArray.Create("// Arrange", "// Act", "// Assert", "// Act and assert");
3029

31-
[NotNull]
32-
private static readonly Action<CodeBlockAnalysisContext> AnalyzeCodeBlockAction = AnalyzeCodeBlock;
33-
3430
[ItemNotNull]
3531
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
3632

@@ -39,7 +35,7 @@ public override void Initialize([NotNull] AnalysisContext context)
3935
context.EnableConcurrentExecution();
4036
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
4137

42-
context.RegisterCodeBlockAction(AnalyzeCodeBlockAction);
38+
context.RegisterCodeBlockAction(AnalyzeCodeBlock);
4339
}
4440

4541
private static void AnalyzeCodeBlock(CodeBlockAnalysisContext context)

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Documentation/AvoidToDoCommentAnalyzer.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ public sealed class AvoidToDoCommentAnalyzer : DiagnosticAnalyzer
2525
private static readonly DiagnosticDescriptor Rule = new(DiagnosticId, Title, MessageFormat, Category.DisplayName, DiagnosticSeverity.Info, true,
2626
Description, Category.GetHelpLinkUri(DiagnosticId));
2727

28-
[NotNull]
29-
private static readonly Action<SyntaxTreeAnalysisContext> AnalyzeTodoCommentsAction = AnalyzeTodoComments;
30-
3128
[ItemNotNull]
3229
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
3330

@@ -36,7 +33,7 @@ public override void Initialize([NotNull] AnalysisContext context)
3633
context.EnableConcurrentExecution();
3734
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
3835

39-
context.RegisterSyntaxTreeAction(AnalyzeTodoCommentsAction);
36+
context.RegisterSyntaxTreeAction(AnalyzeTodoComments);
4037
}
4138

4239
private static void AnalyzeTodoComments(SyntaxTreeAnalysisContext context)

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Documentation/DocumentInternalMemberAnalyzer.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,6 @@ public sealed class DocumentInternalMemberAnalyzer : DiagnosticAnalyzer
4444
[ItemNotNull]
4545
private static readonly HashSet<string> EmptyHashSet = [];
4646

47-
[NotNull]
48-
private static readonly Action<SymbolAnalysisContext> AnalyzeNamedTypeAction = context => context.SkipEmptyName(AnalyzeNamedType);
49-
50-
[NotNull]
51-
private static readonly Action<SymbolAnalysisContext> AnalyzeMemberAction = context => context.SkipEmptyName(AnalyzeMember);
52-
5347
[ItemNotNull]
5448
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
5549
ImmutableArray.Create(MissingTypeOrMemberRule, MissingParameterRule, ExtraParameterRule);
@@ -59,8 +53,8 @@ public override void Initialize([NotNull] AnalysisContext context)
5953
context.EnableConcurrentExecution();
6054
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
6155

62-
context.RegisterSymbolAction(AnalyzeNamedTypeAction, SymbolKind.NamedType);
63-
context.RegisterSymbolAction(AnalyzeMemberAction, MemberSymbolKinds);
56+
context.SafeRegisterSymbolAction(AnalyzeNamedType, SymbolKind.NamedType);
57+
context.SafeRegisterSymbolAction(AnalyzeMember, MemberSymbolKinds);
6458
}
6559

6660
private static void AnalyzeNamedType(SymbolAnalysisContext context)

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Framework/AvoidQuerySyntaxForSimpleExpressionAnalyzer.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ public sealed class AvoidQuerySyntaxForSimpleExpressionAnalyzer : DiagnosticAnal
2525
private static readonly DiagnosticDescriptor Rule = new(DiagnosticId, Title, MessageFormat, Category.DisplayName, DiagnosticSeverity.Info, true,
2626
Description, Category.GetHelpLinkUri(DiagnosticId));
2727

28-
[NotNull]
29-
private static readonly Action<SyntaxNodeAnalysisContext> AnalyzeQueryExpressionAction = AnalyzeQueryExpression;
30-
3128
[ItemNotNull]
3229
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
3330

@@ -36,7 +33,7 @@ public override void Initialize([NotNull] AnalysisContext context)
3633
context.EnableConcurrentExecution();
3734
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
3835

39-
context.RegisterSyntaxNodeAction(AnalyzeQueryExpressionAction, SyntaxKind.QueryExpression);
36+
context.RegisterSyntaxNodeAction(AnalyzeQueryExpression, SyntaxKind.QueryExpression);
4037
}
4138

4239
private static void AnalyzeQueryExpression(SyntaxNodeAnalysisContext context)

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Framework/BuildWithTheHighestWarningLevelAnalyzer.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.Collections.Immutable;
32
using JetBrains.Annotations;
43
using Microsoft.CodeAnalysis;
@@ -22,9 +21,6 @@ public sealed class BuildWithTheHighestWarningLevelAnalyzer : DiagnosticAnalyzer
2221
private static readonly DiagnosticDescriptor Rule = new(DiagnosticId, Title, MessageFormat, Category.DisplayName, DiagnosticSeverity.Warning, true,
2322
Description, Category.GetHelpLinkUri(DiagnosticId));
2423

25-
[NotNull]
26-
private static readonly Action<CompilationAnalysisContext> AnalyzeCompilationOptionsAction = AnalyzeCompilationOptions;
27-
2824
[ItemNotNull]
2925
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);
3026

@@ -33,7 +29,7 @@ public override void Initialize([NotNull] AnalysisContext context)
3329
context.EnableConcurrentExecution();
3430
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
3531

36-
context.RegisterCompilationAction(AnalyzeCompilationOptionsAction);
32+
context.RegisterCompilationAction(AnalyzeCompilationOptions);
3733
}
3834

3935
private static void AnalyzeCompilationOptions(CompilationAnalysisContext context)

0 commit comments

Comments
 (0)