Skip to content
Closed
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// == NServiceBus.Core.Analyzer/NServiceBus.Core.Analyzer.Handlers.AddMultipleHandlersInterceptor/InterceptionsOfAddMultipleHandlers.g.cs ==
// <auto-generated/>

#nullable enable annotations
#nullable disable warnings

// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0612, CS0618

namespace System.Runtime.CompilerServices
{
[global::System.Diagnostics.Conditional("DEBUG")]
[global::System.AttributeUsage(global::System.AttributeTargets.Method, AllowMultiple = true)]
sealed file class InterceptsLocationAttribute : global::System.Attribute
{
public InterceptsLocationAttribute(int version, string data)
{
_ = version;
_ = data;
}
}
}

namespace NServiceBus
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("NServiceBus.Core.Analyzer", "10.0.0.0")]
static file class InterceptionsOfAddMultipleHandlers
{
extension (NServiceBus.EndpointConfiguration endpointConfiguration)
{
[global::System.Runtime.CompilerServices.InterceptsLocationAttribute(1, "{PLATFORM-SPECIFIC-BASE64-DATA}")] // test.cs(11,13)
public void RegisterMultipleHandlers_1()
{
var settings = NServiceBus.Configuration.AdvancedExtensibility.AdvancedExtensibilityExtensions.GetSettings(endpointConfiguration);
var messageHandlerRegistry = settings.GetOrCreate<NServiceBus.Unicast.MessageHandlerRegistry>();
var messageMetadataRegistry = settings.GetOrCreate<NServiceBus.Unicast.Messages.MessageMetadataRegistry>();

// Register global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.HandleOrderCreated
messageHandlerRegistry.AddMessageHandlerForMessage<global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.HandleOrderCreated, global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderCreated>();
messageMetadataRegistry.RegisterMessageTypeWithHierarchy(typeof(global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderCreated), []);

// Register global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.HandleOrderShipped
messageHandlerRegistry.AddMessageHandlerForMessage<global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.HandleOrderShipped, global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderShipped>();
messageMetadataRegistry.RegisterMessageTypeWithHierarchy(typeof(global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderShipped), []);

// Register global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderSaga
messageHandlerRegistry.AddMessageHandlerForMessage<global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderSaga, global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderCreated>();
messageMetadataRegistry.RegisterMessageTypeWithHierarchy(typeof(global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderCreated), []);
messageHandlerRegistry.AddMessageHandlerForMessage<global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderSaga, global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderShipped>();
messageMetadataRegistry.RegisterMessageTypeWithHierarchy(typeof(global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderShipped), []);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// == NServiceBus.Core.Analyzer/NServiceBus.Core.Analyzer.Handlers.AddMultipleHandlersInterceptor/InterceptionsOfAddMultipleHandlers.g.cs ==
// <auto-generated/>

#nullable enable annotations
#nullable disable warnings

// Suppress warnings about [Obsolete] member usage in generated code.
#pragma warning disable CS0612, CS0618

namespace System.Runtime.CompilerServices
{
[global::System.Diagnostics.Conditional("DEBUG")]
[global::System.AttributeUsage(global::System.AttributeTargets.Method, AllowMultiple = true)]
sealed file class InterceptsLocationAttribute : global::System.Attribute
{
public InterceptsLocationAttribute(int version, string data)
{
_ = version;
_ = data;
}
}
}

namespace NServiceBus
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("NServiceBus.Core.Analyzer", "10.0.0.0")]
static file class InterceptionsOfAddMultipleHandlers
{
extension (NServiceBus.EndpointConfiguration endpointConfiguration)
{
[global::System.Runtime.CompilerServices.InterceptsLocationAttribute(1, "{PLATFORM-SPECIFIC-BASE64-DATA}")] // test.cs(12,13)
public void RegisterMultipleHandlers_1()
{
var settings = NServiceBus.Configuration.AdvancedExtensibility.AdvancedExtensibilityExtensions.GetSettings(endpointConfiguration);
var messageHandlerRegistry = settings.GetOrCreate<NServiceBus.Unicast.MessageHandlerRegistry>();
var messageMetadataRegistry = settings.GetOrCreate<NServiceBus.Unicast.Messages.MessageMetadataRegistry>();

// Register global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.HandleOrderCreated
messageHandlerRegistry.AddMessageHandlerForMessage<global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.HandleOrderCreated, global::Messages.OrderCreated>();
messageMetadataRegistry.RegisterMessageTypeWithHierarchy(typeof(global::Messages.OrderCreated), []);

// Register global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderSaga
messageHandlerRegistry.AddMessageHandlerForMessage<global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderSaga, global::Messages.OrderCreated>();
messageMetadataRegistry.RegisterMessageTypeWithHierarchy(typeof(global::Messages.OrderCreated), []);
messageHandlerRegistry.AddMessageHandlerForMessage<global::Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName.OrderSaga, global::Messages.OrderShipped>();
messageMetadataRegistry.RegisterMessageTypeWithHierarchy(typeof(global::Messages.OrderShipped), []);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
namespace NServiceBus.Core.Analyzer.Tests.Handlers;

using Analyzer.Handlers;
using Helpers;
using NUnit.Framework;

public class AddMultipleHandlersTests
{
[Test]
public void AddByAssembly()
{
var source = """
using System.Threading.Tasks;
using NServiceBus;

namespace Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName;

public class Test
{
[NServiceBusRegistrations]
public void Configure(EndpointConfiguration cfg)
{
cfg.AddHandlersFromAssembly("Particular.MyOutputAssembly");
}
}

public class HandleOrderCreated : IHandleMessages<OrderCreated>
{
public Task Handle(OrderCreated message, IMessageHandlerContext context) => Task.CompletedTask;
}

public class HandleOrderShipped: IHandleMessages<OrderShipped>
{
public Task Handle(OrderShipped message, IMessageHandlerContext context) => Task.CompletedTask;
}

public class OrderSaga : Saga<OrderSagaData>,
IAmStartedByMessages<OrderCreated>,
IHandleMessages<OrderShipped>
{
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<OrderSagaData> mapper)
{
mapper.MapSaga(s => s.OrderId)
.ToMessage<OrderCreated>(m => m.OrderId)
.ToMessage<OrderShipped>(m => m.OrderId);
}

public Task Handle(OrderCreated message, IMessageHandlerContext context) => Task.CompletedTask;
public Task Handle(OrderShipped message, IMessageHandlerContext context) => Task.CompletedTask;
}

public class OrderSagaData : ContainSagaData
{
public string OrderId { get; set; }
}

public class OrderCreated : IEvent
{
public string OrderId { get; set; }
}

public class OrderShipped : IEvent
{
public string OrderId { get; set; }
}
""";

SourceGeneratorTest.ForIncrementalGenerator<AddMultipleHandlersInterceptor>("Particular.MyOutputAssembly")
.WithSource(source, "test.cs")
.WithGeneratorStages("HandlerSpec", "HandlerSpecs")
.Approve()
.AssertRunsAreEqual();
}


[Test]
public void AddByNamespace()
{
var source = """
using System.Threading.Tasks;
using NServiceBus;
using Messages;

namespace Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName;

public class Test
{
[NServiceBusRegistrations]
public void Configure(EndpointConfiguration cfg)
{
cfg.AddHandlersFromNamespace("Particular.MyOutputAssembly.Some.Deep.Custom.NamespaceName");
}
}

public class HandleOrderCreated : IHandleMessages<OrderCreated>
{
public Task Handle(OrderCreated message, IMessageHandlerContext context) => Task.CompletedTask;
}

public class OrderSaga : Saga<OrderSagaData>,
IAmStartedByMessages<OrderCreated>,
IHandleMessages<OrderShipped>
{
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<OrderSagaData> mapper)
{
mapper.MapSaga(s => s.OrderId)
.ToMessage<OrderCreated>(m => m.OrderId)
.ToMessage<OrderShipped>(m => m.OrderId);
}

public Task Handle(OrderCreated message, IMessageHandlerContext context) => Task.CompletedTask;
public Task Handle(OrderShipped message, IMessageHandlerContext context) => Task.CompletedTask;
}

public class OrderSagaData : ContainSagaData
{
public string OrderId { get; set; }
}
""";

var otherNamespaceSource = """
using System.Threading.Tasks;
using NServiceBus;
using Messages;

namespace Particular.MyOutputAssembly.Some.Deep.Custom.NotThisNamespace;

public class HandleOrderShipped: IHandleMessages<OrderShipped>
{
public Task Handle(OrderShipped message, IMessageHandlerContext context) => Task.CompletedTask;
}
""";

var messages = """
using NServiceBus;

namespace Messages;

public class OrderCreated : IEvent
{
public string OrderId { get; set; }
}

public class OrderShipped : IEvent
{
public string OrderId { get; set; }
}
""";

SourceGeneratorTest.ForIncrementalGenerator<AddMultipleHandlersInterceptor>("Particular.MyOutputAssembly")
.WithSource(source, "test.cs")
.WithSource(otherNamespaceSource, "othernamespace.cs")
.WithSource(messages, "messages.cs")
.WithGeneratorStages("HandlerSpec", "HandlerSpecs")
.Approve()
.AssertRunsAreEqual();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ static file class InterceptionsOfAddHandlerMethod
sourceWriter.Indentation++;

var groups = handlers
.GroupBy(h => h.HandlerType)
.GroupBy(h => h.RegistrationInfo.HandlerType)
.OrderBy(g => g.Key.InterceptorMethodName, StringComparer.Ordinal)
.ToArray();
for (int index = 0; index < groups.Length; index++)
Expand All @@ -51,14 +51,15 @@ static file class InterceptionsOfAddHandlerMethod

HandlerSpec first = group.First();
sourceWriter.WriteLine($$"""
public void {{first.HandlerType.InterceptorMethodName}}()
public void {{first.RegistrationInfo.HandlerType.InterceptorMethodName}}()
{
""");
sourceWriter.Indentation++;

sourceWriter.WriteLine("System.ArgumentNullException.ThrowIfNull(endpointConfiguration);");

EmitHandlerRegistryCode(sourceWriter, first);
EmitHandlerRegistryLocals(sourceWriter);
EmitHandlerRegistryCode(sourceWriter, first.RegistrationInfo);

sourceWriter.Indentation--;
sourceWriter.WriteLine("}");
Expand All @@ -74,13 +75,15 @@ static file class InterceptionsOfAddHandlerMethod
context.AddSource("InterceptionsOfAddHandlerMethod.g.cs", sourceWriter.ToSourceText());
}

public static void EmitHandlerRegistryCode(SourceWriter sourceWriter, HandlerSpec handlerSpec)
{
public static void EmitHandlerRegistryLocals(SourceWriter sourceWriter) =>
sourceWriter.WriteLine("""
var settings = NServiceBus.Configuration.AdvancedExtensibility.AdvancedExtensibilityExtensions.GetSettings(endpointConfiguration);
var messageHandlerRegistry = settings.GetOrCreate<NServiceBus.Unicast.MessageHandlerRegistry>();
var messageMetadataRegistry = settings.GetOrCreate<NServiceBus.Unicast.Messages.MessageMetadataRegistry>();
""");

public static void EmitHandlerRegistryCode(SourceWriter sourceWriter, HandlerRegistrationSpec handlerSpec)
{
foreach (var registration in handlerSpec.Registrations)
{
var addType = registration.RegistrationType switch
Expand Down
Loading
Loading