Skip to content

Commit

Permalink
Removed cached delegates (the compiler does it since C# 11)
Browse files Browse the repository at this point in the history
  • Loading branch information
bkoelman committed Apr 22, 2024
1 parent 0c3e9cd commit 664553f
Show file tree
Hide file tree
Showing 56 changed files with 210 additions and 505 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<IncludeBuildOutput>false</IncludeBuildOutput>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<BaseOutputPath>$(SolutionDir)..\bin</BaseOutputPath>
<NoWarn>$(NoWarn);RS1012</NoWarn>
</PropertyGroup>

<PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,40 +1,128 @@
using System;
using System.Collections.Immutable;
using System.Linq;
using JetBrains.Annotations;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Diagnostics;

namespace CSharpGuidelinesAnalyzer.Extensions;

/// <summary />
/// <summary>
/// Replaces the built-in registration methods to not run on broken code.
/// </summary>
internal static class AnalysisContextExtensions
{
public static void SkipInvalid(this OperationAnalysisContext context, [NotNull] Action<OperationAnalysisContext> action)
public static void SafeRegisterOperationAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<OperationAnalysisContext> action,
[NotNull] params OperationKind[] operationKinds)
{
analysisContext.RegisterOperationAction(context => SkipInvalid(context, action), operationKinds);
}

public static void SafeRegisterOperationAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<OperationAnalysisContext> action,
ImmutableArray<OperationKind> operationKinds)
{
analysisContext.RegisterOperationAction(context => SkipInvalid(context, action), operationKinds);
}

public static void SafeRegisterOperationBlockAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<OperationBlockAnalysisContext> action)
{
analysisContext.RegisterOperationBlockAction(context => SkipInvalid(context, action));
}

public static void SafeRegisterSymbolAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<SymbolAnalysisContext> action,
[NotNull] params SymbolKind[] symbolKinds)
{
analysisContext.RegisterSymbolAction(context => SkipEmptyName(context, action), symbolKinds);
}

public static void SafeRegisterSymbolAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<SymbolAnalysisContext> action,
ImmutableArray<SymbolKind> symbolKinds)
{
analysisContext.RegisterSymbolAction(context => SkipEmptyName(context, action), symbolKinds);
}

public static void SafeRegisterSyntaxNodeAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<SymbolAnalysisContext> action,
[NotNull] params SyntaxKind[] syntaxKinds)
{
analysisContext.RegisterSyntaxNodeAction(context => SkipEmptyName(context, action), syntaxKinds);
}

public static void SafeRegisterSyntaxNodeAction([NotNull] this AnalysisContext analysisContext, [NotNull] Action<SymbolAnalysisContext> action,
ImmutableArray<SyntaxKind> syntaxKinds)
{
analysisContext.RegisterSyntaxNodeAction(context => SkipEmptyName(context, action), syntaxKinds);
}

public static void SafeRegisterOperationAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
[NotNull] Action<OperationAnalysisContext> action, [NotNull] params OperationKind[] operationKinds)
{
compilationStartAnalysisContext.RegisterOperationAction(context => SkipInvalid(context, action), operationKinds);
}

public static void SafeRegisterOperationAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
[NotNull] Action<OperationAnalysisContext> action, ImmutableArray<OperationKind> operationKinds)
{
compilationStartAnalysisContext.RegisterOperationAction(context => SkipInvalid(context, action), operationKinds);
}

public static void SafeRegisterOperationBlockAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
[NotNull] Action<OperationBlockAnalysisContext> action)
{
compilationStartAnalysisContext.RegisterOperationBlockAction(context => SkipInvalid(context, action));
}

public static void SafeRegisterSymbolAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
[NotNull] Action<SymbolAnalysisContext> action, [NotNull] params SymbolKind[] symbolKinds)
{
compilationStartAnalysisContext.RegisterSymbolAction(context => SkipEmptyName(context, action), symbolKinds);
}

public static void SafeRegisterSymbolAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
[NotNull] Action<SymbolAnalysisContext> action, ImmutableArray<SymbolKind> symbolKinds)
{
compilationStartAnalysisContext.RegisterSymbolAction(context => SkipEmptyName(context, action), symbolKinds);
}

public static void SafeRegisterSyntaxNodeAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
[NotNull] Action<SymbolAnalysisContext> action, [NotNull] params SyntaxKind[] syntaxKinds)
{
compilationStartAnalysisContext.RegisterSyntaxNodeAction(context => SkipEmptyName(context, action), syntaxKinds);
}

public static void SafeRegisterSyntaxNodeAction([NotNull] this CompilationStartAnalysisContext compilationStartAnalysisContext,
[NotNull] Action<SymbolAnalysisContext> action, ImmutableArray<SyntaxKind> syntaxKinds)
{
compilationStartAnalysisContext.RegisterSyntaxNodeAction(context => SkipEmptyName(context, action), syntaxKinds);
}

private static void SkipInvalid(OperationAnalysisContext context, [NotNull] Action<OperationAnalysisContext> action)
{
if (!context.Operation.HasErrors(context.Compilation, context.CancellationToken))
{
action(context);
}
}

public static void SkipInvalid(this OperationBlockAnalysisContext context, [NotNull] Action<OperationBlockAnalysisContext> action)
private static void SkipInvalid(OperationBlockAnalysisContext context, [NotNull] Action<OperationBlockAnalysisContext> action)
{
if (!context.OperationBlocks.Any(block => block.HasErrors(context.Compilation, context.CancellationToken)))
{
action(context);
}
}

public static void SkipEmptyName(this SymbolAnalysisContext context, [NotNull] Action<SymbolAnalysisContext> action)
private static void SkipEmptyName(SymbolAnalysisContext context, [NotNull] Action<SymbolAnalysisContext> action)
{
if (!string.IsNullOrEmpty(context.Symbol.Name))
{
action(context);
}
}

public static void SkipEmptyName(this SyntaxNodeAnalysisContext context, [NotNull] Action<SymbolAnalysisContext> action)
private static void SkipEmptyName(SyntaxNodeAnalysisContext context, [NotNull] Action<SymbolAnalysisContext> action)
{
SymbolAnalysisContext symbolContext = context.ToSymbolContext();
symbolContext.SkipEmptyName(_ => action(symbolContext));
SkipEmptyName(symbolContext, _ => action(symbolContext));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ public sealed class AvoidStaticClassAnalyzer : DiagnosticAnalyzer
private static readonly DiagnosticDescriptor MemberRule = new(DiagnosticId, Title, MemberMessageFormat, Category.DisplayName, DiagnosticSeverity.Info, true,
Description, Category.GetHelpLinkUri(DiagnosticId));

[NotNull]
private static readonly Action<SymbolAnalysisContext> AnalyzeNamedTypeAction = context => context.SkipEmptyName(AnalyzeNamedType);

[ItemNotNull]
private static readonly ImmutableArray<string> PlatformInvokeWrapperTypeNames =
ImmutableArray.Create("NativeMethods", "SafeNativeMethods", "UnsafeNativeMethods");
Expand All @@ -46,7 +43,7 @@ public override void Initialize([NotNull] AnalysisContext context)
context.EnableConcurrentExecution();
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);

context.RegisterSymbolAction(AnalyzeNamedTypeAction, SymbolKind.NamedType);
context.SafeRegisterSymbolAction(AnalyzeNamedType, SymbolKind.NamedType);
}

private static void AnalyzeNamedType(SymbolAnalysisContext context)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Collections.Immutable;
using CSharpGuidelinesAnalyzer.Extensions;
using JetBrains.Annotations;
Expand Down Expand Up @@ -26,9 +25,6 @@ public sealed class DoNotHideInheritedMemberAnalyzer : DiagnosticAnalyzer
private static readonly ImmutableArray<SymbolKind> MemberSymbolKinds = ImmutableArray.Create(SymbolKind.Field,
SymbolKind.Property, SymbolKind.Method, SymbolKind.Event, SymbolKind.NamedType);

[NotNull]
private static readonly Action<SymbolAnalysisContext> AnalyzeMemberAction = context => context.SkipEmptyName(AnalyzeMember);

[ItemNotNull]
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);

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

context.RegisterSymbolAction(AnalyzeMemberAction, MemberSymbolKinds);
context.SafeRegisterSymbolAction(AnalyzeMember, MemberSymbolKinds);
}

private static void AnalyzeMember(SymbolAnalysisContext context)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Collections.Immutable;
using CSharpGuidelinesAnalyzer.Extensions;
using JetBrains.Annotations;
Expand Down Expand Up @@ -26,9 +25,6 @@ public sealed class TypeShouldHaveASinglePurposeAnalyzer : DiagnosticAnalyzer
private static readonly DiagnosticDescriptor Rule = new(DiagnosticId, Title, MessageFormat, Category.DisplayName, DiagnosticSeverity.Warning, true,
Description, Category.GetHelpLinkUri(DiagnosticId));

[NotNull]
private static readonly Action<SyntaxNodeAnalysisContext> AnalyzeTypeDeclarationAction = AnalyzeTypeDeclaration;

[NotNull]
private static readonly SyntaxKind[] TypeDeclarationKinds =
[
Expand All @@ -50,7 +46,7 @@ public override void Initialize([NotNull] AnalysisContext context)
context.EnableConcurrentExecution();
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);

context.RegisterSyntaxNodeAction(AnalyzeTypeDeclarationAction, TypeDeclarationKinds);
context.RegisterSyntaxNodeAction(AnalyzeTypeDeclaration, TypeDeclarationKinds);
}

private static void AnalyzeTypeDeclaration(SyntaxNodeAnalysisContext context)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Collections.Immutable;
using System.Linq;
using JetBrains.Annotations;
Expand Down Expand Up @@ -28,9 +27,6 @@ public sealed class AvoidInlineCommentAnalyzer : DiagnosticAnalyzer
[ItemNotNull]
private static readonly ImmutableArray<string> ArrangeActAssertLines = ImmutableArray.Create("// Arrange", "// Act", "// Assert", "// Act and assert");

[NotNull]
private static readonly Action<CodeBlockAnalysisContext> AnalyzeCodeBlockAction = AnalyzeCodeBlock;

[ItemNotNull]
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);

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

context.RegisterCodeBlockAction(AnalyzeCodeBlockAction);
context.RegisterCodeBlockAction(AnalyzeCodeBlock);
}

private static void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ public sealed class AvoidToDoCommentAnalyzer : DiagnosticAnalyzer
private static readonly DiagnosticDescriptor Rule = new(DiagnosticId, Title, MessageFormat, Category.DisplayName, DiagnosticSeverity.Info, true,
Description, Category.GetHelpLinkUri(DiagnosticId));

[NotNull]
private static readonly Action<SyntaxTreeAnalysisContext> AnalyzeTodoCommentsAction = AnalyzeTodoComments;

[ItemNotNull]
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);

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

context.RegisterSyntaxTreeAction(AnalyzeTodoCommentsAction);
context.RegisterSyntaxTreeAction(AnalyzeTodoComments);
}

private static void AnalyzeTodoComments(SyntaxTreeAnalysisContext context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,6 @@ public sealed class DocumentInternalMemberAnalyzer : DiagnosticAnalyzer
[ItemNotNull]
private static readonly HashSet<string> EmptyHashSet = [];

[NotNull]
private static readonly Action<SymbolAnalysisContext> AnalyzeNamedTypeAction = context => context.SkipEmptyName(AnalyzeNamedType);

[NotNull]
private static readonly Action<SymbolAnalysisContext> AnalyzeMemberAction = context => context.SkipEmptyName(AnalyzeMember);

[ItemNotNull]
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
ImmutableArray.Create(MissingTypeOrMemberRule, MissingParameterRule, ExtraParameterRule);
Expand All @@ -59,8 +53,8 @@ public override void Initialize([NotNull] AnalysisContext context)
context.EnableConcurrentExecution();
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);

context.RegisterSymbolAction(AnalyzeNamedTypeAction, SymbolKind.NamedType);
context.RegisterSymbolAction(AnalyzeMemberAction, MemberSymbolKinds);
context.SafeRegisterSymbolAction(AnalyzeNamedType, SymbolKind.NamedType);
context.SafeRegisterSymbolAction(AnalyzeMember, MemberSymbolKinds);
}

private static void AnalyzeNamedType(SymbolAnalysisContext context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ public sealed class AvoidQuerySyntaxForSimpleExpressionAnalyzer : DiagnosticAnal
private static readonly DiagnosticDescriptor Rule = new(DiagnosticId, Title, MessageFormat, Category.DisplayName, DiagnosticSeverity.Info, true,
Description, Category.GetHelpLinkUri(DiagnosticId));

[NotNull]
private static readonly Action<SyntaxNodeAnalysisContext> AnalyzeQueryExpressionAction = AnalyzeQueryExpression;

[ItemNotNull]
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);

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

context.RegisterSyntaxNodeAction(AnalyzeQueryExpressionAction, SyntaxKind.QueryExpression);
context.RegisterSyntaxNodeAction(AnalyzeQueryExpression, SyntaxKind.QueryExpression);
}

private static void AnalyzeQueryExpression(SyntaxNodeAnalysisContext context)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Collections.Immutable;
using JetBrains.Annotations;
using Microsoft.CodeAnalysis;
Expand All @@ -22,9 +21,6 @@ public sealed class BuildWithTheHighestWarningLevelAnalyzer : DiagnosticAnalyzer
private static readonly DiagnosticDescriptor Rule = new(DiagnosticId, Title, MessageFormat, Category.DisplayName, DiagnosticSeverity.Warning, true,
Description, Category.GetHelpLinkUri(DiagnosticId));

[NotNull]
private static readonly Action<CompilationAnalysisContext> AnalyzeCompilationOptionsAction = AnalyzeCompilationOptions;

[ItemNotNull]
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);

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

context.RegisterCompilationAction(AnalyzeCompilationOptionsAction);
context.RegisterCompilationAction(AnalyzeCompilationOptions);
}

private static void AnalyzeCompilationOptions(CompilationAnalysisContext context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,6 @@ public sealed class DoNotImplicitlyConvertToDynamicAnalyzer : DiagnosticAnalyzer
private static readonly DiagnosticDescriptor Rule = new(DiagnosticId, Title, MessageFormat, Category.DisplayName, DiagnosticSeverity.Warning, true,
Description, Category.GetHelpLinkUri(DiagnosticId));

[NotNull]
private static readonly Action<CompilationStartAnalysisContext> RegisterCompilationStartAction = RegisterCompilationStart;

#pragma warning disable RS1008 // Avoid storing per-compilation data into the fields of a diagnostic analyzer.
[NotNull]
private static readonly Action<OperationAnalysisContext, INamedTypeSymbol> AnalyzeConversionAction = (context, objectHandleType) =>
context.SkipInvalid(_ => AnalyzeConversion(context, objectHandleType));
#pragma warning restore RS1008 // Avoid storing per-compilation data into the fields of a diagnostic analyzer.

#pragma warning disable RS1008 // Avoid storing per-compilation data into the fields of a diagnostic analyzer.
[NotNull]
private static readonly Action<OperationAnalysisContext, INamedTypeSymbol> AnalyzeCompoundAssignmentAction = (context, objectHandleType) =>
context.SkipInvalid(_ => AnalyzeCompoundAssignment(context, objectHandleType));
#pragma warning restore RS1008 // Avoid storing per-compilation data into the fields of a diagnostic analyzer.

[ItemNotNull]
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);

Expand All @@ -47,15 +32,15 @@ public override void Initialize([NotNull] AnalysisContext context)
context.EnableConcurrentExecution();
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);

context.RegisterCompilationStartAction(RegisterCompilationStartAction);
context.RegisterCompilationStartAction(RegisterCompilationStart);
}

private static void RegisterCompilationStart([NotNull] CompilationStartAnalysisContext startContext)
{
INamedTypeSymbol objectHandleType = KnownTypes.SystemRuntimeRemotingObjectHandle(startContext.Compilation);

startContext.RegisterOperationAction(context => AnalyzeConversionAction(context, objectHandleType), OperationKind.Conversion);
startContext.RegisterOperationAction(context => AnalyzeCompoundAssignmentAction(context, objectHandleType), OperationKind.CompoundAssignment);
startContext.SafeRegisterOperationAction(context => AnalyzeConversion(context, objectHandleType), OperationKind.Conversion);
startContext.SafeRegisterOperationAction(context => AnalyzeCompoundAssignment(context, objectHandleType), OperationKind.CompoundAssignment);
}

private static void AnalyzeConversion(OperationAnalysisContext context, [CanBeNull] INamedTypeSymbol objectHandleType)
Expand Down
Loading

0 comments on commit 664553f

Please sign in to comment.