Skip to content

Commit 8dd1b6d

Browse files
authored
Support resolving MethodInfo from strongly-typed route handler delegate (#53184)
* Support resolving MethodInfo from strongly-typed route handler delegate * Update API and fix MethodInfo references
1 parent eb3ad9b commit 8dd1b6d

File tree

48 files changed

+428
-192
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+428
-192
lines changed

src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
132132
codeWriter.WriteLine("var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;");
133133
codeWriter.WriteLine("return new RequestDelegateResult(targetDelegate, metadata);");
134134
codeWriter.EndBlockWithSemicolon();
135+
codeWriter.WriteLine($"var castHandler = Cast(handler, {endpoint.EmitHandlerDelegateType()} => throw null!);");
135136
codeWriter.WriteLine("return MapCore(");
136137
codeWriter.Indent++;
137138
codeWriter.WriteLine("endpoints,");
@@ -148,7 +149,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
148149
codeWriter.WriteLine("handler,");
149150
codeWriter.WriteLine($"{endpoint.EmitVerb()},");
150151
codeWriter.WriteLine("populateMetadata,");
151-
codeWriter.WriteLine("createRequestDelegate);");
152+
codeWriter.WriteLine("createRequestDelegate,");
153+
codeWriter.WriteLine("castHandler.Method);");
152154
codeWriter.Indent--;
153155
codeWriter.EndBlock();
154156
return stringWriter.ToString();
@@ -271,7 +273,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
271273
return;
272274
}
273275
using var stringWriter = new StringWriter(CultureInfo.InvariantCulture);
274-
using var codeWriter = new CodeWriter(stringWriter, baseIndent: 2);
276+
using var codeWriter = new CodeWriter(stringWriter, baseIndent: 0);
275277
foreach (var endpoint in endpointsCode)
276278
{
277279
codeWriter.WriteLine(endpoint);

src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -513,18 +513,19 @@ namespace Microsoft.AspNetCore.Http.Generated
513513
file static class GeneratedRouteBuilderExtensionsCore
514514
{
515515
private static readonly JsonOptions FallbackJsonOptions = new();
516-
{{GetVerbs(verbs)}}
517-
{{endpoints}}
516+
{{GetVerbs(verbs)}}
517+
{{endpoints}}
518518
519519
internal static RouteHandlerBuilder MapCore(
520520
this IEndpointRouteBuilder routes,
521521
string pattern,
522522
Delegate handler,
523523
IEnumerable<string>? httpMethods,
524524
MetadataPopulator populateMetadata,
525-
RequestDelegateFactoryFunc createRequestDelegate)
525+
RequestDelegateFactoryFunc createRequestDelegate,
526+
MethodInfo methodInfo)
526527
{
527-
return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
528+
return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate, methodInfo);
528529
}
529530
530531
private static T Cast<T>(Delegate d, T _) where T : Delegate

src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public static void EmitRequestHandler(this Endpoint endpoint, CodeWriter codeWri
7272

7373
if (endpoint.Parameters.Length > 0)
7474
{
75-
codeWriter.WriteLine(endpoint.Parameters.EmitParameterPreparation(endpoint.EmitterContext, codeWriter.Indent));
75+
codeWriter.WriteLineNoTabs(endpoint.Parameters.EmitParameterPreparation(endpoint.EmitterContext, codeWriter.Indent));
7676
}
7777

7878
codeWriter.WriteLine("if (wasParamCheckFailure)");
@@ -182,7 +182,7 @@ public static void EmitFilteredRequestHandler(this Endpoint endpoint, CodeWriter
182182

183183
if (endpoint.Parameters.Length > 0)
184184
{
185-
codeWriter.WriteLine(endpoint.Parameters.EmitParameterPreparation(endpoint.EmitterContext, codeWriter.Indent));
185+
codeWriter.WriteLineNoTabs(endpoint.Parameters.EmitParameterPreparation(endpoint.EmitterContext, codeWriter.Indent));
186186
}
187187

188188
codeWriter.WriteLine("if (wasParamCheckFailure)");

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/HandlesEndpointsWithAndWithoutDiagnostics.generated.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,15 @@ namespace Microsoft.AspNetCore.Http.Generated
138138
var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
139139
return new RequestDelegateResult(targetDelegate, metadata);
140140
};
141+
var castHandler = Cast(handler, global::System.String () => throw null!);
141142
return MapCore(
142143
endpoints,
143144
pattern,
144145
handler,
145146
GetVerb,
146147
populateMetadata,
147-
createRequestDelegate);
148+
createRequestDelegate,
149+
castHandler.Method);
148150
}
149151

150152

@@ -155,9 +157,10 @@ namespace Microsoft.AspNetCore.Http.Generated
155157
Delegate handler,
156158
IEnumerable<string>? httpMethods,
157159
MetadataPopulator populateMetadata,
158-
RequestDelegateFactoryFunc createRequestDelegate)
160+
RequestDelegateFactoryFunc createRequestDelegate,
161+
MethodInfo methodInfo)
159162
{
160-
return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
163+
return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate, methodInfo);
161164
}
162165

163166
private static T Cast<T>(Delegate d, T _) where T : Delegate

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_NullableReturn.generated.txt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,15 @@ namespace Microsoft.AspNetCore.Http.Generated
157157
var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
158158
return new RequestDelegateResult(targetDelegate, metadata);
159159
};
160+
var castHandler = Cast(handler, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.BindableClassWithNullReturn? arg0) => throw null!);
160161
return MapCore(
161162
endpoints,
162163
pattern,
163164
handler,
164165
GetVerb,
165166
populateMetadata,
166-
createRequestDelegate);
167+
createRequestDelegate,
168+
castHandler.Method);
167169
}
168170

169171
[InterceptsLocation(@"TestMapActions.cs", 29, 5)]
@@ -265,13 +267,15 @@ namespace Microsoft.AspNetCore.Http.Generated
265267
var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
266268
return new RequestDelegateResult(targetDelegate, metadata);
267269
};
270+
var castHandler = Cast(handler, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.BindableStructWithNullReturn arg0) => throw null!);
268271
return MapCore(
269272
endpoints,
270273
pattern,
271274
handler,
272275
GetVerb,
273276
populateMetadata,
274-
createRequestDelegate);
277+
createRequestDelegate,
278+
castHandler.Method);
275279
}
276280

277281

@@ -282,9 +286,10 @@ namespace Microsoft.AspNetCore.Http.Generated
282286
Delegate handler,
283287
IEnumerable<string>? httpMethods,
284288
MetadataPopulator populateMetadata,
285-
RequestDelegateFactoryFunc createRequestDelegate)
289+
RequestDelegateFactoryFunc createRequestDelegate,
290+
MethodInfo methodInfo)
286291
{
287-
return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
292+
return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate, methodInfo);
288293
}
289294

290295
private static T Cast<T>(Delegate d, T _) where T : Delegate

0 commit comments

Comments
 (0)