@@ -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