diff --git a/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.Models.cs b/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.Models.cs deleted file mode 100644 index 216070ff..00000000 --- a/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.Models.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Diagnostics.CodeAnalysis; - -// ReSharper disable UnusedAutoPropertyAccessor.Local - -namespace Immediate.Handlers.Generators.ImmediateHandlers; - -public sealed partial class ImmediateHandlersGenerator -{ - [ExcludeFromCodeCoverage] - private sealed record Behavior - { - public required string RegistrationType { get; init; } - public required string NonGenericTypeName { get; init; } - public required string Name { get; init; } - public required string? RequestType { get; init; } - public required string? ResponseType { get; init; } - } - - [ExcludeFromCodeCoverage] - private sealed record Parameter - { - public required string? Attributes { get; init; } - public required string Type { get; init; } - public required string Name { get; init; } - } - - [ExcludeFromCodeCoverage] - private sealed record GenericType - { - public required string Name { get; init; } - public required EquatableReadOnlyList Implements { get; init; } - } - - [ExcludeFromCodeCoverage] - private sealed record Handler - { - public required string? Namespace { get; init; } - public required string ClassName { get; init; } - public required string DisplayName { get; init; } - - public required string MethodName { get; init; } - public required EquatableReadOnlyList Parameters { get; init; } - public required bool UseToken { get; init; } - - public required GenericType RequestType { get; init; } - public required GenericType? ResponseType { get; init; } - - public EquatableReadOnlyList? OverrideBehaviors { get; init; } - } - - [ExcludeFromCodeCoverage] - private sealed record ConstraintInfo - { - public required string? RequestType { get; init; } - public required string? ResponseType { get; init; } - } -} diff --git a/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.cs b/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.cs index f5bcd6f3..ee796fe5 100644 --- a/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.cs +++ b/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.cs @@ -4,7 +4,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Scriban; -namespace Immediate.Handlers.Generators.ImmediateHandlers; +namespace Immediate.Handlers.Generators; [Generator] public sealed partial class ImmediateHandlersGenerator : IIncrementalGenerator @@ -13,14 +13,9 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { var hasMsDi = context .MetadataReferencesProvider + .Where(r => (r.Display ?? "").Contains("Microsoft.Extensions.DependencyInjection.Abstractions")) .Collect() - .Select( - (refs, _) => refs - .Any( - r => (r.Display ?? "") - .Contains("Microsoft.Extensions.DependencyInjection.Abstractions") - ) - ); + .Select((refs, _) => refs.Any()); var assemblyName = context.CompilationProvider .Select((cp, _) => cp.AssemblyName! @@ -41,7 +36,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) .ForAttributeWithMetadataName( "Immediate.Handlers.Shared.BehaviorsAttribute", (node, _) => node is CompilationUnitSyntax, - TransformBehaviors + TransformBehaviors.ParseBehaviors ) .SelectMany((x, _) => x) .Collect(); @@ -50,7 +45,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) .ForAttributeWithMetadataName( "Immediate.Handlers.Shared.HandlerAttribute", predicate: (node, _) => node is TypeDeclarationSyntax, - TransformHandler + TransformHandler.ParseHandler ); var handlerNodes = handlers @@ -161,7 +156,7 @@ Template template ); cancellationToken.ThrowIfCancellationRequested(); - if (pipelineBehaviors.Any(b => b is null)) + if (pipelineBehaviors.Exists(b => b is null)) return; var handlerSource = template.Render(new diff --git a/src/Immediate.Handlers.Generators/Models.cs b/src/Immediate.Handlers.Generators/Models.cs new file mode 100644 index 00000000..15bf0aae --- /dev/null +++ b/src/Immediate.Handlers.Generators/Models.cs @@ -0,0 +1,54 @@ +using System.Diagnostics.CodeAnalysis; + +// ReSharper disable UnusedAutoPropertyAccessor.Local + +namespace Immediate.Handlers.Generators; + +[ExcludeFromCodeCoverage] +public sealed record Behavior +{ + public required string RegistrationType { get; init; } + public required string NonGenericTypeName { get; init; } + public required string Name { get; init; } + public required string? RequestType { get; init; } + public required string? ResponseType { get; init; } +} + +[ExcludeFromCodeCoverage] +public sealed record Parameter +{ + public required string? Attributes { get; init; } + public required string Type { get; init; } + public required string Name { get; init; } +} + +[ExcludeFromCodeCoverage] +public sealed record GenericType +{ + public required string Name { get; init; } + public required EquatableReadOnlyList Implements { get; init; } +} + +[ExcludeFromCodeCoverage] +public sealed record Handler +{ + public required string? Namespace { get; init; } + public required string ClassName { get; init; } + public required string DisplayName { get; init; } + + public required string MethodName { get; init; } + public required EquatableReadOnlyList Parameters { get; init; } + public required bool UseToken { get; init; } + + public required GenericType RequestType { get; init; } + public required GenericType? ResponseType { get; init; } + + public EquatableReadOnlyList? OverrideBehaviors { get; init; } +} + +[ExcludeFromCodeCoverage] +public sealed record ConstraintInfo +{ + public required string? RequestType { get; init; } + public required string? ResponseType { get; init; } +} diff --git a/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.TransformBehaviors.cs b/src/Immediate.Handlers.Generators/TransformBehaviors.cs similarity index 89% rename from src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.TransformBehaviors.cs rename to src/Immediate.Handlers.Generators/TransformBehaviors.cs index 4adcd15e..c80b190a 100644 --- a/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.TransformBehaviors.cs +++ b/src/Immediate.Handlers.Generators/TransformBehaviors.cs @@ -1,21 +1,16 @@ using Microsoft.CodeAnalysis; -namespace Immediate.Handlers.Generators.ImmediateHandlers; +namespace Immediate.Handlers.Generators; -public sealed partial class ImmediateHandlersGenerator +internal static class TransformBehaviors { - private static EquatableReadOnlyList TransformBehaviors( + public static EquatableReadOnlyList ParseBehaviors( GeneratorAttributeSyntaxContext context, CancellationToken cancellationToken - ) - { - cancellationToken.ThrowIfCancellationRequested(); - - return ParseBehaviors(context.Attributes[0], cancellationToken); - } + ) => context.Attributes[0].ParseBehaviors(cancellationToken); - private static EquatableReadOnlyList ParseBehaviors( - AttributeData attribute, + public static EquatableReadOnlyList ParseBehaviors( + this AttributeData attribute, CancellationToken cancellationToken ) { diff --git a/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.TransformHandler.cs b/src/Immediate.Handlers.Generators/TransformHandler.cs similarity index 95% rename from src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.TransformHandler.cs rename to src/Immediate.Handlers.Generators/TransformHandler.cs index 22d4852d..e94fd326 100644 --- a/src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.TransformHandler.cs +++ b/src/Immediate.Handlers.Generators/TransformHandler.cs @@ -2,11 +2,11 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; -namespace Immediate.Handlers.Generators.ImmediateHandlers; +namespace Immediate.Handlers.Generators; -public sealed partial class ImmediateHandlersGenerator +internal static class TransformHandler { - private static Handler? TransformHandler( + public static Handler? ParseHandler( GeneratorAttributeSyntaxContext context, CancellationToken cancellationToken ) @@ -92,9 +92,8 @@ CancellationToken cancellationToken private static EquatableReadOnlyList? GetOverrideBehaviors( INamedTypeSymbol symbol, CancellationToken cancellationToken) => - symbol.GetBehaviorsAttribute() - is { } ba - ? ParseBehaviors(ba, cancellationToken) + symbol.GetBehaviorsAttribute() is { } ba + ? ba.ParseBehaviors(cancellationToken) : null; [return: NotNullIfNotNull(nameof(type))] diff --git a/tests/Immediate.Handlers.Tests/AnalyzerTests/AnalyzerTestHelpers.cs b/tests/Immediate.Handlers.Tests/AnalyzerTests/AnalyzerTestHelpers.cs index 8ec3488a..ea7664b6 100644 --- a/tests/Immediate.Handlers.Tests/AnalyzerTests/AnalyzerTestHelpers.cs +++ b/tests/Immediate.Handlers.Tests/AnalyzerTests/AnalyzerTestHelpers.cs @@ -1,5 +1,5 @@ using System.Diagnostics.CodeAnalysis; -using Immediate.Handlers.Generators.ImmediateHandlers; +using Immediate.Handlers.Generators; using Immediate.Handlers.Tests.Helpers; using Microsoft.CodeAnalysis.CSharp.Testing; using Microsoft.CodeAnalysis.Diagnostics; diff --git a/tests/Immediate.Handlers.Tests/CodeFixTests/CodeFixTestHelper.cs b/tests/Immediate.Handlers.Tests/CodeFixTests/CodeFixTestHelper.cs index b8d09202..0b15db3b 100644 --- a/tests/Immediate.Handlers.Tests/CodeFixTests/CodeFixTestHelper.cs +++ b/tests/Immediate.Handlers.Tests/CodeFixTests/CodeFixTestHelper.cs @@ -14,7 +14,6 @@ public static class CodeFixTestHelper [*.cs] charset = utf-8 - end_of_line = lf indent_style = tab insert_final_newline = true indent_size = 4 diff --git a/tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.cs b/tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.cs index 588bd744..2f880572 100644 --- a/tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.cs +++ b/tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.cs @@ -72,12 +72,12 @@ public interface ILogger; Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", .. assemblies switch { DriverReferenceAssemblies.Normal => Enumerable.Empty(), DriverReferenceAssemblies.Msdi => - ["Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs"], + ["Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs"], DriverReferenceAssemblies.None or _ => throw new UnreachableException(), }, @@ -221,12 +221,12 @@ public interface ILogger; Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", .. assemblies switch { DriverReferenceAssemblies.Normal => Enumerable.Empty(), DriverReferenceAssemblies.Msdi => - ["Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs"], + ["Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs"], DriverReferenceAssemblies.None or _ => throw new UnreachableException(), }, @@ -290,12 +290,12 @@ CancellationToken __ Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH..ConstraintHandler.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH..ConstraintHandler.g.cs", .. assemblies switch { DriverReferenceAssemblies.Normal => Enumerable.Empty(), DriverReferenceAssemblies.Msdi => - ["Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs"], + ["Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs"], DriverReferenceAssemblies.None or _ => throw new UnreachableException(), }, @@ -378,12 +378,12 @@ public interface ILogger; Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", .. assemblies switch { DriverReferenceAssemblies.Normal => Enumerable.Empty(), DriverReferenceAssemblies.Msdi => - ["Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs"], + ["Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs"], DriverReferenceAssemblies.None or _ => throw new UnreachableException(), }, diff --git a/tests/Immediate.Handlers.Tests/GeneratorTests/GeneratorTestHelper.cs b/tests/Immediate.Handlers.Tests/GeneratorTests/GeneratorTestHelper.cs index 8de33d0a..cf1952bb 100644 --- a/tests/Immediate.Handlers.Tests/GeneratorTests/GeneratorTestHelper.cs +++ b/tests/Immediate.Handlers.Tests/GeneratorTests/GeneratorTestHelper.cs @@ -1,5 +1,5 @@ using System.Diagnostics.CodeAnalysis; -using Immediate.Handlers.Generators.ImmediateHandlers; +using Immediate.Handlers.Generators; using Immediate.Handlers.Tests.Helpers; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; diff --git a/tests/Immediate.Handlers.Tests/GeneratorTests/HandlerTests.cs b/tests/Immediate.Handlers.Tests/GeneratorTests/HandlerTests.cs index 69511c75..ead73eca 100644 --- a/tests/Immediate.Handlers.Tests/GeneratorTests/HandlerTests.cs +++ b/tests/Immediate.Handlers.Tests/GeneratorTests/HandlerTests.cs @@ -34,7 +34,7 @@ private static ValueTask HandleAsync( Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", ], result.GeneratedTrees.Select(t => t.FilePath.Replace('\\', '/')) ); @@ -73,7 +73,7 @@ private static ValueTask HandleAsync( Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", ], result.GeneratedTrees.Select(t => t.FilePath.Replace('\\', '/')) ); @@ -112,7 +112,7 @@ Query _ Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", ], result.GeneratedTrees.Select(t => t.FilePath.Replace('\\', '/')) ); @@ -155,8 +155,8 @@ private static ValueTask HandleAsync( Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs", ], result.GeneratedTrees.Select(t => t.FilePath.Replace('\\', '/')) ); @@ -209,8 +209,8 @@ private static ValueTask HandleAsync( Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs", ], result.GeneratedTrees.Select(t => t.FilePath.Replace('\\', '/')) ); @@ -262,8 +262,8 @@ private static ValueTask HandleAsync( Assert.Equal( [ - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", - "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlers.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.Dummy.GetUsersQuery.g.cs", + "Immediate.Handlers.Generators/Immediate.Handlers.Generators.ImmediateHandlersGenerator/IH.ServiceCollectionExtensions.g.cs", ], result.GeneratedTrees.Select(t => t.FilePath.Replace('\\', '/')) );