Skip to content

Commit 29299e5

Browse files
committed
More progress
1 parent d26d16e commit 29299e5

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
lines changed

samples/ConsoleSample/Middleware/ProcessOrderMiddleware.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@ public Task<HandlerResult> BeforeAsync(CreateOrder command, CancellationToken ca
2020
return Task.FromResult(HandlerResult.Continue($"Validated order {command.OrderId}"));
2121
}
2222

23-
public Task AfterAsync(CreateOrder command, object? beforeResult, object? handlerResult, CancellationToken cancellationToken)
23+
public Task AfterAsync(CreateOrder command, object? handlerResult, CancellationToken cancellationToken)
2424
{
2525
Console.WriteLine($"🔸 [ProcessOrderMiddleware] After: Order processing completed");
26-
Console.WriteLine($"🔸 [ProcessOrderMiddleware] Before result: {beforeResult}");
2726
Console.WriteLine($"🔸 [ProcessOrderMiddleware] Handler result: {handlerResult}");
2827
return Task.CompletedTask;
2928
}

src/Foundatio.Mediator.SourceGenerator/HandlerGenerator.cs

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,15 @@ private static void GenerateHandleMethod(IndentedStringBuilder source, HandlerIn
136136
allowNull = m.Method.ReturnType.IsNullable || m.Method.ReturnType.IsReferenceType;
137137
defaultValue = allowNull ? "null" : "default";
138138
source.AppendLine($"{m.Method.ReturnType.UnwrappedFullName}{(allowNull ? "?" : "")} {m.Middleware.Identifier.ToCamelCase()}Result = {defaultValue};");
139+
140+
variables[m.Method.ReturnType.FullName] = $"{m.Middleware.Identifier.ToCamelCase()}Result{(allowNull ? "!" : "")}";
141+
if (m.Method.ReturnType.IsTuple)
142+
{
143+
foreach (var tupleItem in m.Method.ReturnType.TupleItems)
144+
{
145+
variables[tupleItem.TypeFullName] = $"{m.Middleware.Identifier.ToCamelCase()}Result.{tupleItem.Name}{(allowNull ? "!" : "")}";
146+
}
147+
}
139148
}
140149
source.AppendLineIf(beforeMiddleware.Any(m => m.Method.HasReturnValue));
141150

@@ -163,7 +172,7 @@ private static void GenerateHandleMethod(IndentedStringBuilder source, HandlerIn
163172
asyncModifier = m.Method.IsAsync ? "await " : "";
164173
result = m.Method.ReturnType.IsVoid ? "" : $"{m.Middleware.Identifier.ToCamelCase()}Result = ";
165174
accessor = m.Middleware.IsStatic ? m.Middleware.FullName : $"{m.Middleware.Identifier.ToCamelCase()}";
166-
parameters = BuildParameters(m.Method.Parameters);
175+
parameters = BuildParameters(source, m.Method.Parameters);
167176

168177
source.AppendLine($"{result}{asyncModifier}{accessor}.{m.Method.MethodName}({parameters});");
169178
}
@@ -173,7 +182,7 @@ private static void GenerateHandleMethod(IndentedStringBuilder source, HandlerIn
173182
asyncModifier = handler.ReturnType.IsTask ? "await " : "";
174183
result = handler.ReturnType.IsVoid ? "" : "handlerResult = ";
175184
accessor = handler.IsStatic ? handler.FullName : $"handlerInstance";
176-
parameters = BuildParameters(handler.Parameters);
185+
parameters = BuildParameters(source, handler.Parameters);
177186

178187
source.AppendLineIf("var handlerInstance = GetOrCreateHandler(serviceProvider);", !handler.IsStatic);
179188
source.AppendLine($"{result}{asyncModifier}{accessor}.{handler.MethodName}({parameters});");
@@ -184,7 +193,7 @@ private static void GenerateHandleMethod(IndentedStringBuilder source, HandlerIn
184193
{
185194
asyncModifier = m.Method.IsAsync ? "await " : "";
186195
accessor = m.Middleware.IsStatic ? m.Middleware.FullName : $"{m.Middleware.Identifier.ToCamelCase()}";
187-
parameters = BuildParameters(m.Method.Parameters, variables);
196+
parameters = BuildParameters(source, m.Method.Parameters, variables);
188197

189198
source.AppendLine($"{asyncModifier}{accessor}.{m.Method.MethodName}({parameters});");
190199
}
@@ -214,7 +223,7 @@ private static void GenerateHandleMethod(IndentedStringBuilder source, HandlerIn
214223
{
215224
asyncModifier = m.Method.IsAsync ? "await " : "";
216225
accessor = m.Method.IsStatic ? m.Middleware.FullName : $"{m.Middleware.Identifier.ToCamelCase()}";
217-
parameters = BuildParameters(m.Method.Parameters, variables);
226+
parameters = BuildParameters(source, m.Method.Parameters, variables);
218227

219228
source.AppendLine($"{asyncModifier}{accessor}.{m.Method.MethodName}({parameters});");
220229
}
@@ -323,16 +332,19 @@ private static void GenerateInterceptorMethod(IndentedStringBuilder source, Hand
323332
source.AppendLine($"[System.Runtime.CompilerServices.InterceptsLocation({callSite.Location.Version}, \"{callSite.Location.Data}\")] // {callSite.Location.DisplayLocation}");
324333
}
325334

326-
string asyncModifier = responseType.IsTask ? "async " : "";
335+
string asyncModifier = handler.IsAsync ? "async " : "";
336+
string returnType = methodName.EndsWith("Async") ? $"System.Threading.Tasks.ValueTask<{responseType.UnwrappedFullName}>" : responseType.UnwrappedFullName;
337+
if (responseType.IsVoid)
338+
returnType = methodName.EndsWith("Async") ? "System.Threading.Tasks.ValueTask" : "void";
327339
string parameters = "this Foundatio.Mediator.IMediator mediator, object message, System.Threading.CancellationToken cancellationToken = default";
328-
source.AppendLine($"public static {asyncModifier}{responseType.FullName} {interceptorMethod}({parameters})");
340+
source.AppendLine($"public static {asyncModifier}{returnType} {interceptorMethod}({parameters})");
329341
source.AppendLine("{");
330342

331343
source.IncrementIndent();
332344

333345
source.AppendLine($"var typedMessage = ({handler.MessageType.FullName})message;");
334346

335-
asyncModifier = responseType.IsTask ? "await " : "";
347+
asyncModifier = handler.IsAsync ? "await " : "";
336348
if (handler.ReturnType.IsTuple)
337349
{
338350
source.AppendLine($"var result = {asyncModifier}{handlerMethod}(mediator, typedMessage, cancellationToken);");
@@ -351,12 +363,21 @@ private static void GenerateInterceptorMethod(IndentedStringBuilder source, Hand
351363
source.AppendLine("}");
352364
}
353365

354-
private static string BuildParameters(EquatableArray<ParameterInfo> parameters, Dictionary<string, string>? variables = null)
366+
private static string BuildParameters(IndentedStringBuilder source, EquatableArray<ParameterInfo> parameters, Dictionary<string, string>? variables = null)
355367
{
356368
var parameterValues = new List<string>();
357369

370+
const bool debugVariables = true;
371+
372+
foreach (var kvp in variables ?? [])
373+
{
374+
source.AppendLineIf($"// Variable: {kvp.Key} = {kvp.Value}", debugVariables);
375+
}
376+
358377
foreach (var param in parameters)
359378
{
379+
source.AppendLineIf($"// Param: Name='{param.Name}', Type.FullName='{param.Type.FullName}', Type.UnwrappedFullName='{param.Type.UnwrappedFullName}', IsMessageParameter={param.IsMessageParameter}, Type.IsObject={param.Type.IsObject}, Type.IsCancellationToken={param.Type.IsCancellationToken}", debugVariables);
380+
360381
if (param.IsMessageParameter)
361382
{
362383
parameterValues.Add("message");
@@ -377,6 +398,10 @@ private static string BuildParameters(EquatableArray<ParameterInfo> parameters,
377398
{
378399
parameterValues.Add(unwrappedVariableName);
379400
}
401+
else if (variables != null && param.Type.UnwrappedFullName.EndsWith("?") && variables.TryGetValue(param.Type.UnwrappedFullName.TrimEnd('?'), out string? nullableVariableName))
402+
{
403+
parameterValues.Add(nullableVariableName);
404+
}
380405
else
381406
{
382407
parameterValues.Add($"serviceProvider.GetRequiredService<{param.Type.FullName}>()");

0 commit comments

Comments
 (0)