Skip to content

Commit d532a15

Browse files
Add diagnostic if Handle method is not private (#52)
1 parent 363b547 commit d532a15

20 files changed

+80
-37
lines changed

src/Immediate.Handlers.Analyzers/AnalyzerReleases.Shipped.md

+1
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ IHR0007 | ImmediateHandler | Error | BehaviorsAnalyzer
1313
IHR0008 | ImmediateHandler | Error | BehaviorsAnalyzer
1414
IHR0009 | ImmediateHandler | Error | HandlerClassAnalyzer
1515
IHR0010 | ImmediateHandler | Error | HandlerClassAnalyzer
16+
IHR0011 | ImmediateHandler | Error | HandlerClassAnalyzer

src/Immediate.Handlers.Analyzers/DiagnosticIds.cs

+1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ internal static class DiagnosticIds
1414
public const string IHR0008BehaviorsMustUseUnboundGenerics = "IHR0008";
1515
public const string IHR0009HandlerMethodMustBeStatic = "IHR0009";
1616
public const string IHR0010HandlerMethodMustBeUnique = "IHR0010";
17+
public const string IHR0011HandlerMethodMustBePrivate = "IHR0011";
1718
}

src/Immediate.Handlers.Analyzers/HandlerClassAnalyzer.cs

+25-1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@ public sealed class HandlerClassAnalyzer : DiagnosticAnalyzer
6262
description: "Static handler method must be static."
6363
);
6464

65+
private static readonly DiagnosticDescriptor HandlerMethodMustBePrivate =
66+
new(
67+
id: DiagnosticIds.IHR0011HandlerMethodMustBePrivate,
68+
title: "Handler method must be private",
69+
messageFormat: "Method '{0}' must not conflict with another static handler method",
70+
category: "ImmediateHandler",
71+
defaultSeverity: DiagnosticSeverity.Error,
72+
isEnabledByDefault: true,
73+
description: "Static handler method must be static."
74+
);
75+
6576
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
6677
ImmutableArray.Create(
6778
[
@@ -70,6 +81,7 @@ public sealed class HandlerClassAnalyzer : DiagnosticAnalyzer
7081
HandlerMustNotBeNestedInAnotherClass,
7182
HandlerMethodMustBeStatic,
7283
HandlerMethodMustBeUnique,
84+
HandlerMethodMustBePrivate,
7385
]);
7486

7587
public override void Initialize(AnalysisContext context)
@@ -164,7 +176,19 @@ private static void AnalyzeSymbol(SymbolAnalysisContext context)
164176
Diagnostic.Create(
165177
HandlerMethodMustReturnTask,
166178
methodSymbol.Locations[0],
167-
methodSymbol.Name)
179+
methodSymbol.Name
180+
)
181+
);
182+
}
183+
184+
if (methodSymbol.DeclaredAccessibility is not Accessibility.Private)
185+
{
186+
context.ReportDiagnostic(
187+
Diagnostic.Create(
188+
HandlerMethodMustBePrivate,
189+
methodSymbol.Locations[0],
190+
methodSymbol.Name
191+
)
168192
);
169193
}
170194

tests/Immediate.Handlers.Tests/AnalyzerTests/AnalyzerTestHelpers.cs

+1-6
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ public static class AnalyzerTestHelpers
99
{
1010
public static CSharpAnalyzerTest<TAnalyzer, DefaultVerifier> CreateAnalyzerTest<TAnalyzer>(
1111
string inputSource,
12-
DriverReferenceAssemblies assemblies,
13-
IEnumerable<DiagnosticResult> expectedDiagnostics
14-
)
12+
DriverReferenceAssemblies assemblies)
1513
where TAnalyzer : DiagnosticAnalyzer, new()
1614
{
1715
var csTest = new CSharpAnalyzerTest<TAnalyzer, DefaultVerifier>
@@ -31,9 +29,6 @@ IEnumerable<DiagnosticResult> expectedDiagnostics
3129
csTest.TestState.AdditionalReferences
3230
.AddRange(assemblies.GetAdditionalReferences());
3331

34-
csTest.TestState.ExpectedDiagnostics
35-
.AddRange(expectedDiagnostics);
36-
3732
return csTest;
3833
}
3934
}

tests/Immediate.Handlers.Tests/AnalyzerTests/BehaviorAnalyzerTests/Tests.BehaviorTypeDoesNotHaveTwoGenericParameters.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ private static ValueTask<IEnumerable<User>> HandleAsync(
7272
}
7373
}
7474
""",
75-
DriverReferenceAssemblies.Normal,
76-
[]
75+
DriverReferenceAssemblies.Normal
7776
).RunAsync();
7877
}

tests/Immediate.Handlers.Tests/AnalyzerTests/BehaviorAnalyzerTests/Tests.BehaviorTypeDoesNotInheritFromGenericBehavior.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ private static ValueTask<IEnumerable<User>> HandleAsync(
7171
}
7272
}
7373
""",
74-
DriverReferenceAssemblies.Normal,
75-
[]
74+
DriverReferenceAssemblies.Normal
7675
).RunAsync();
7776
}

tests/Immediate.Handlers.Tests/AnalyzerTests/BehaviorAnalyzerTests/Tests.BehaviorTypeDoesNotUseUnboundedReference.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ private static ValueTask<IEnumerable<User>> HandleAsync(
6868
}
6969
}
7070
""",
71-
DriverReferenceAssemblies.Normal,
72-
[]
71+
DriverReferenceAssemblies.Normal
7372
).RunAsync();
7473
}

tests/Immediate.Handlers.Tests/AnalyzerTests/BehaviorAnalyzerTests/Tests.BehaviorTypeIsUsedMoreThanOnce.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ private static ValueTask<IEnumerable<User>> HandleAsync(
7070
}
7171
}
7272
""",
73-
DriverReferenceAssemblies.Normal,
74-
[]
73+
DriverReferenceAssemblies.Normal
7574
).RunAsync();
7675
}

tests/Immediate.Handlers.Tests/AnalyzerTests/BehaviorAnalyzerTests/Tests.BehaviorTypeIsValid.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ private static ValueTask<IEnumerable<User>> HandleAsync(
7979
}
8080
}
8181
""",
82-
DriverReferenceAssemblies.Normal,
83-
[]
82+
DriverReferenceAssemblies.Normal
8483
).RunAsync();
8584
}

tests/Immediate.Handlers.Tests/AnalyzerTests/HandlerClassAnalyzerTests/Tests.HandleMethodDoesNotExist.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ public static class {|IHR0001:GetUsersQuery|}
2525
public record Query;
2626
}
2727
""",
28-
DriverReferenceAssemblies.Normal,
29-
[]
28+
DriverReferenceAssemblies.Normal
3029
).RunAsync();
3130
}

tests/Immediate.Handlers.Tests/AnalyzerTests/HandlerClassAnalyzerTests/Tests.HandleMethodDoesNotReturnTask.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ public ValueTask<IEnumerable<User>> GetUsers()
4545
4646
public interface ILogger<T>;
4747
""",
48-
DriverReferenceAssemblies.Normal,
49-
[]
48+
DriverReferenceAssemblies.Normal
5049
).RunAsync();
5150
}

tests/Immediate.Handlers.Tests/AnalyzerTests/HandlerClassAnalyzerTests/Tests.HandleMethodIsCorrectWithIntReturn.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ private ValueTask<int> Handle(
3939
}
4040
}
4141
""",
42-
DriverReferenceAssemblies.Normal,
43-
[]
42+
DriverReferenceAssemblies.Normal
4443
).RunAsync();
4544
}

tests/Immediate.Handlers.Tests/AnalyzerTests/HandlerClassAnalyzerTests/Tests.HandleMethodIsCorrectWithVoidReturn.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ private async ValueTask Handle(
3737
}
3838
}
3939
""",
40-
DriverReferenceAssemblies.Normal,
41-
[]
40+
DriverReferenceAssemblies.Normal
4241
).RunAsync();
4342
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using Immediate.Handlers.Analyzers;
2+
using Immediate.Handlers.Tests.Helpers;
3+
4+
namespace Immediate.Handlers.Tests.AnalyzerTests.HandlerClassAnalyzerTests;
5+
6+
[System.Diagnostics.CodeAnalysis.SuppressMessage("Naming", "CA1724:Type names should not match namespaces", Justification = "Not being consumed by other code")]
7+
public partial class Tests
8+
{
9+
[Fact]
10+
public async Task HandleMethodIsNotPrivate_AlertDiagnostic() =>
11+
await AnalyzerTestHelpers.CreateAnalyzerTest<HandlerClassAnalyzer>(
12+
"""
13+
using System;
14+
using System.Collections.Generic;
15+
using System.IO;
16+
using System.Linq;
17+
using System.Net.Http;
18+
using System.Threading;
19+
using System.Threading.Tasks;
20+
using Immediate.Handlers.Shared;
21+
22+
[Handler]
23+
public class GetUsersQuery
24+
{
25+
public record Query;
26+
27+
public static ValueTask<int> {|IHR0011:HandleAsync|}(
28+
Query _,
29+
CancellationToken token)
30+
{
31+
return ValueTask.FromResult(0);
32+
}
33+
}
34+
""",
35+
DriverReferenceAssemblies.Normal
36+
).RunAsync();
37+
}

tests/Immediate.Handlers.Tests/AnalyzerTests/HandlerClassAnalyzerTests/Tests.HandleMethodIsNotStatic.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ public ValueTask<IEnumerable<User>> GetUsers()
5353
5454
public interface ILogger<T>;
5555
""",
56-
DriverReferenceAssemblies.Normal,
57-
[]
56+
DriverReferenceAssemblies.Normal
5857
).RunAsync();
5958
}

tests/Immediate.Handlers.Tests/AnalyzerTests/HandlerClassAnalyzerTests/Tests.HandleMethodIsNotUnique.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public record Query;
3939
}
4040
}
4141
""",
42-
DriverReferenceAssemblies.Normal,
43-
[]
42+
DriverReferenceAssemblies.Normal
4443
).RunAsync();
4544
}

tests/Immediate.Handlers.Tests/AnalyzerTests/HandlerClassAnalyzerTests/Tests.HandlerClassNested.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ private static ValueTask<int> HandleAsync(
3333
}
3434
}
3535
""",
36-
DriverReferenceAssemblies.Normal,
37-
[]
36+
DriverReferenceAssemblies.Normal
3837
).RunAsync();
3938
}

tests/Immediate.Handlers.Tests/AnalyzerTests/RenderModeAnalyzerTests/Tests.RenderModeCast.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ private static ValueTask<int> HandleAsync(
3535
}
3636
}
3737
""",
38-
DriverReferenceAssemblies.Normal,
39-
[]
38+
DriverReferenceAssemblies.Normal
4039
).RunAsync();
4140
}

tests/Immediate.Handlers.Tests/AnalyzerTests/RenderModeAnalyzerTests/Tests.RenderModeIsNone.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ private static ValueTask<int> HandleAsync(
3535
}
3636
}
3737
""",
38-
DriverReferenceAssemblies.Normal,
39-
[]
38+
DriverReferenceAssemblies.Normal
4039
).RunAsync();
4140
}

tests/Immediate.Handlers.Tests/AnalyzerTests/RenderModeAnalyzerTests/Tests.RenderModeIsNormal.cs

+1-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ private static ValueTask<int> HandleAsync(
3535
}
3636
}
3737
""",
38-
DriverReferenceAssemblies.Normal,
39-
[]
38+
DriverReferenceAssemblies.Normal
4039
).RunAsync();
4140
}

0 commit comments

Comments
 (0)