Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Reorganize code
  • Loading branch information
viceroypenguin committed Jul 14, 2025
commit 9e38f89bd39a5113036002532dcb58cba2fe2aee

This file was deleted.

17 changes: 6 additions & 11 deletions src/Immediate.Handlers.Generators/ImmediateHandlersGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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!
Expand All @@ -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();
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
54 changes: 54 additions & 0 deletions src/Immediate.Handlers.Generators/Models.cs
Original file line number Diff line number Diff line change
@@ -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<string> 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<Parameter> Parameters { get; init; }
public required bool UseToken { get; init; }

public required GenericType RequestType { get; init; }
public required GenericType? ResponseType { get; init; }

public EquatableReadOnlyList<Behavior?>? OverrideBehaviors { get; init; }
}

[ExcludeFromCodeCoverage]
public sealed record ConstraintInfo
{
public required string? RequestType { get; init; }
public required string? ResponseType { get; init; }
}
Original file line number Diff line number Diff line change
@@ -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<Behavior?> TransformBehaviors(
public static EquatableReadOnlyList<Behavior?> ParseBehaviors(
GeneratorAttributeSyntaxContext context,
CancellationToken cancellationToken
)
{
cancellationToken.ThrowIfCancellationRequested();

return ParseBehaviors(context.Attributes[0], cancellationToken);
}
) => context.Attributes[0].ParseBehaviors(cancellationToken);

private static EquatableReadOnlyList<Behavior?> ParseBehaviors(
AttributeData attribute,
public static EquatableReadOnlyList<Behavior?> ParseBehaviors(
this AttributeData attribute,
CancellationToken cancellationToken
)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down Expand Up @@ -92,9 +92,8 @@ CancellationToken cancellationToken
private static EquatableReadOnlyList<Behavior?>? GetOverrideBehaviors(
INamedTypeSymbol symbol,
CancellationToken cancellationToken) =>
symbol.GetBehaviorsAttribute()
is { } ba
? ParseBehaviors(ba, cancellationToken)
symbol.GetBehaviorsAttribute() is { } ba
? ba.ParseBehaviors(cancellationToken)
: null;

[return: NotNullIfNotNull(nameof(type))]
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 8 additions & 8 deletions tests/Immediate.Handlers.Tests/GeneratorTests/BehaviorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,12 @@ public interface ILogger<T>;

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<string>(),
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(),
},
Expand Down Expand Up @@ -221,12 +221,12 @@ public interface ILogger<T>;

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<string>(),
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(),
},
Expand Down Expand Up @@ -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<string>(),
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(),
},
Expand Down Expand Up @@ -378,12 +378,12 @@ public interface ILogger<T>;

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<string>(),
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(),
},
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
18 changes: 9 additions & 9 deletions tests/Immediate.Handlers.Tests/GeneratorTests/HandlerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ private static ValueTask<int> 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('\\', '/'))
);
Expand Down Expand Up @@ -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('\\', '/'))
);
Expand Down Expand Up @@ -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('\\', '/'))
);
Expand Down Expand Up @@ -155,8 +155,8 @@ private static ValueTask<int> 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('\\', '/'))
);
Expand Down Expand Up @@ -209,8 +209,8 @@ private static ValueTask<int> 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('\\', '/'))
);
Expand Down Expand Up @@ -262,8 +262,8 @@ private static ValueTask<int> 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('\\', '/'))
);
Expand Down