Bladeren bron

Update RDG to use interceptors feature (#48817)

* Update RDG to use interceptors feature

* Address feedback from review

* Add separator to method name and update same interceptor test

* Use group index to distinguish interceptor methods
Safia Abdalla 2 jaren geleden
bovenliggende
commit
2196cfd2cb
56 gewijzigde bestanden met toevoegingen van 8196 en 8123 verwijderingen
  1. 1 1
      eng/Versions.props
  2. 1 0
      src/Http/Http.Extensions/gen/Microsoft.AspNetCore.Http.RequestDelegateGenerator.csproj
  3. 103 128
      src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs
  4. 30 85
      src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs
  5. 74 0
      src/Http/Http.Extensions/gen/RequestDelegateGeneratorSuppressor.cs
  6. 7 4
      src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Endpoint.cs
  7. 6 3
      src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs
  8. 15 0
      src/Http/Http.Extensions/gen/StaticRouteHandlerModel/InvocationOperationExtensions.cs
  9. 16 6
      src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs
  10. 1926 1960
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt
  11. 183 184
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt
  12. 109 124
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt
  13. 93 108
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt
  14. 93 108
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt
  15. 109 124
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt
  16. 92 107
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt
  17. 92 107
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt
  18. 266 283
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt
  19. 98 501
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt
  20. 110 125
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt
  21. 123 138
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt
  22. 123 138
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt
  23. 123 138
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt
  24. 123 138
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt
  25. 132 147
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt
  26. 95 110
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt
  27. 126 141
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt
  28. 89 104
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt
  29. 89 104
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt
  30. 82 97
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt
  31. 81 96
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt
  32. 79 94
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt
  33. 118 133
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt
  34. 118 133
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt
  35. 100 115
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt
  36. 110 125
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt
  37. 131 145
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt
  38. 131 145
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt
  39. 131 145
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt
  40. 131 145
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt
  41. 130 145
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt
  42. 123 138
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt
  43. 236 325
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt
  44. 255 272
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt
  45. 175 190
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt
  46. 529 0
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt
  47. 404 0
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt
  48. 510 529
      src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt
  49. 91 0
      src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs
  50. 30 20
      src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs
  51. 2 1
      src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs
  52. 1 0
      src/Http/samples/MinimalSample/MinimalSample.csproj
  53. 1 0
      src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj
  54. 6 0
      src/Shared/RoslynUtils/CodeWriter.cs
  55. 39 0
      src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs
  56. 5 14
      src/Shared/RoslynUtils/SyntaxTreeExtensions.cs

+ 1 - 1
eng/Versions.props

@@ -245,7 +245,7 @@
     <Analyzer_MicrosoftCodeAnalysisCSharpWorkspacesVersion>3.3.1</Analyzer_MicrosoftCodeAnalysisCSharpWorkspacesVersion>
     <!-- Pin the version of the M.CA dependencies that we utilize with a cutom version property $(MicrosoftCodeAnalysisVersion_LatestVS) to avoid automatically
     consuming the newest version of the packages when using the $(MicrosoftCodeAnalysisCSharpVersion) properties in source-build. -->
-    <MicrosoftCodeAnalysisVersion_LatestVS>4.5.0</MicrosoftCodeAnalysisVersion_LatestVS>
+    <MicrosoftCodeAnalysisVersion_LatestVS>4.7.0-3.23314.3</MicrosoftCodeAnalysisVersion_LatestVS>
     <MicrosoftCodeAnalysisExternalAccessAspNetCoreVersion>4.7.0-3.23314.3</MicrosoftCodeAnalysisExternalAccessAspNetCoreVersion>
     <MicrosoftCodeAnalysisCommonVersion>4.7.0-3.23314.3</MicrosoftCodeAnalysisCommonVersion>
     <MicrosoftCodeAnalysisCSharpVersion>4.7.0-3.23314.3</MicrosoftCodeAnalysisCSharpVersion>

+ 1 - 0
src/Http/Http.Extensions/gen/Microsoft.AspNetCore.Http.RequestDelegateGenerator.csproj

@@ -30,6 +30,7 @@
     <Compile Include="$(SharedSourceRoot)RoslynUtils\SyntaxTreeExtensions.cs" LinkBase="Shared" />
     <Compile Include="$(SharedSourceRoot)RoslynUtils\ParsabilityHelper.cs" LinkBase="Shared" />
     <Compile Include="$(SharedSourceRoot)RoslynUtils\CodeWriter.cs" LinkBase="Shared" />
+    <Compile Include="$(SharedSourceRoot)RoslynUtils\IncrementalValuesProviderExtensions.cs" LinkBase="Shared" />
     <Compile Include="$(SharedSourceRoot)Diagnostics\AnalyzerDebug.cs" LinkBase="Shared" />
   </ItemGroup>
 

+ 103 - 128
src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs

@@ -27,10 +27,7 @@ public sealed class RequestDelegateGenerator : IIncrementalGenerator
             {
                 var operation = context.SemanticModel.GetOperation(context.Node, token);
                 var wellKnownTypes = WellKnownTypes.GetOrCreate(context.SemanticModel.Compilation);
-                if (operation is IInvocationOperation invocationOperation &&
-                    invocationOperation.TryGetRouteHandlerArgument(out var routeHandlerParameter) &&
-                    routeHandlerParameter is { Parameter.Type: {} delegateType } &&
-                    SymbolEqualityComparer.Default.Equals(delegateType, wellKnownTypes.Get(WellKnownTypeData.WellKnownType.System_Delegate)))
+                if (operation.IsValidOperation(wellKnownTypes, out var invocationOperation))
                 {
                     return new Endpoint(invocationOperation, wellKnownTypes, context.SemanticModel);
                 }
@@ -56,117 +53,104 @@ public sealed class RequestDelegateGenerator : IIncrementalGenerator
             .Where(endpoint => endpoint.Diagnostics.Count == 0)
             .WithTrackingName(GeneratorSteps.EndpointsWithoutDiagnosicsStep);
 
-        var thunks = endpoints.Select((endpoint, _) =>
-        {
-            using var stringWriter = new StringWriter(CultureInfo.InvariantCulture);
-            using var codeWriter = new CodeWriter(stringWriter, baseIndent: 3);
-            codeWriter.InitializeIndent();
-            codeWriter.WriteLine($"[{endpoint.EmitSourceKey()}] = (");
-            codeWriter.Indent++;
-            codeWriter.WriteLine("(methodInfo, options) =>");
-            codeWriter.StartBlock();
-            codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");");
-            codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");");
-            codeWriter.WriteLine($"options.EndpointBuilder.Metadata.Add(new SourceKey{endpoint.EmitSourceKey()});");
-            endpoint.EmitEndpointMetadataPopulation(codeWriter);
-            codeWriter.WriteLine("return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };");
-            codeWriter.EndBlockWithComma();
-            codeWriter.WriteLine("(del, options, inferredMetadataResult) =>");
-            codeWriter.StartBlock();
-            codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");");
-            codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");");
-            codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.ApplicationServices != null, ""ApplicationServices not found."");");
-            codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.FilterFactories != null, ""FilterFactories not found."");");
-            codeWriter.WriteLine($"var handler = ({endpoint.EmitHandlerDelegateType(considerOptionality: true)})del;");
-            codeWriter.WriteLine("EndpointFilterDelegate? filteredInvocation = null;");
-            codeWriter.WriteLine("var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;");
-            endpoint.EmitLoggingPreamble(codeWriter);
-            endpoint.EmitJsonPreparation(codeWriter);
-            endpoint.EmitRouteOrQueryResolver(codeWriter);
-            endpoint.EmitJsonBodyOrServiceResolver(codeWriter);
-            if (endpoint.NeedsParameterArray)
-            {
-                codeWriter.WriteLine("var parameters = del.Method.GetParameters();");
-            }
-            codeWriter.WriteLineNoTabs(string.Empty);
-            codeWriter.WriteLine("if (options.EndpointBuilder.FilterFactories.Count > 0)");
-            codeWriter.StartBlock();
-            codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true
-                ? "filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic =>"
-                : "filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>");
-            codeWriter.StartBlock();
-            codeWriter.WriteLine("if (ic.HttpContext.Response.StatusCode == 400)");
-            codeWriter.StartBlock();
-            codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true
-                ? "return (object?)Results.Empty;"
-                : "return ValueTask.FromResult<object?>(Results.Empty);");
-            codeWriter.EndBlock();
-            endpoint.EmitFilteredInvocation(codeWriter);
-            codeWriter.EndBlockWithComma();
-            codeWriter.WriteLine("options.EndpointBuilder,");
-            codeWriter.WriteLine("handler.Method);");
-            codeWriter.EndBlock();
-            codeWriter.WriteLineNoTabs(string.Empty);
-            endpoint.EmitRequestHandler(codeWriter);
-            codeWriter.WriteLineNoTabs(string.Empty);
-            endpoint.EmitFilteredRequestHandler(codeWriter);
-            codeWriter.WriteLineNoTabs(string.Empty);
-            codeWriter.WriteLine("RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;");
-            codeWriter.WriteLine("var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;");
-            codeWriter.WriteLine("return new RequestDelegateResult(targetDelegate, metadata);");
-            codeWriter.Indent--;
-            codeWriter.Write("}),");
-            return stringWriter.ToString();
-        });
-
-        var stronglyTypedEndpointDefinitions = endpoints
-            .Collect()
-            .Select((endpoints, _) =>
+        var interceptorDefinitions = endpoints
+            .GroupWith((endpoint) => endpoint.Location, EndpointDelegateComparer.Instance)
+            .Select((endpointWithLocations, _) =>
             {
-                var dedupedByDelegate = endpoints.Distinct(EndpointDelegateComparer.Instance);
+                var endpoint = endpointWithLocations.Source;
                 using var stringWriter = new StringWriter(CultureInfo.InvariantCulture);
                 using var codeWriter = new CodeWriter(stringWriter, baseIndent: 2);
-                foreach (var endpoint in dedupedByDelegate)
+                foreach (var location in endpointWithLocations.Elements)
                 {
-                    codeWriter.WriteLine($"internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder {endpoint.HttpMethod}(");
-                    codeWriter.Indent++;
-                    codeWriter.WriteLine("this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,");
-                    // MapFallback overloads that only take a delegate do not need a pattern argument
-                    if (endpoint.HttpMethod != "MapFallback" || endpoint.Operation.Arguments.Length != 2)
-                    {
-                        codeWriter.WriteLine(@"[global::System.Diagnostics.CodeAnalysis.StringSyntax(""Route"")] string pattern,");
-                    }
-                    // MapMethods overloads define an additional `httpMethods` parameter
-                    if (endpoint.HttpMethod == "MapMethods")
-                    {
-                        codeWriter.WriteLine("global::System.Collections.Generic.IEnumerable<string> httpMethods,");
-                    }
-                    codeWriter.WriteLine($"global::{endpoint.EmitHandlerDelegateType()} handler,");
-                    codeWriter.WriteLine(@"[global::System.Runtime.CompilerServices.CallerFilePath] string filePath = """",");
-                    codeWriter.WriteLine("[global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)");
-                    codeWriter.Indent--;
-                    codeWriter.StartBlock();
-                    codeWriter.WriteLine("return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(");
-                    codeWriter.Indent++;
-                    codeWriter.WriteLine("endpoints,");
-                    // For `MapFallback` overloads that only take a delegate, provide the assumed default
-                    // Otherwise, pass the pattern provided from the MapX invocation
-                    if (endpoint.HttpMethod != "MapFallback" && endpoint.Operation.Arguments.Length != 2)
-                    {
-                        codeWriter.WriteLine("pattern,");
-                    }
-                    else
-                    {
-                        codeWriter.WriteLine($"{SymbolDisplay.FormatLiteral("{*path:nonfile}", true)},");
-                    }
-                    codeWriter.WriteLine("handler,");
-                    codeWriter.WriteLine($"{endpoint.EmitVerb()},");
-                    codeWriter.WriteLine("filePath,");
-                    codeWriter.WriteLine("lineNumber);");
-                    codeWriter.Indent--;
-                    codeWriter.EndBlock();
+                    codeWriter.WriteLine($$"""[InterceptsLocation(@"{{location.File}}", {{location.LineNumber}}, {{location.CharacterNumber}})]""");
                 }
-
+                codeWriter.WriteLine($"internal static RouteHandlerBuilder {endpoint.HttpMethod}{endpointWithLocations.Index}(");
+                codeWriter.Indent++;
+                codeWriter.WriteLine("this IEndpointRouteBuilder endpoints,");
+                // MapFallback overloads that only take a delegate do not need a pattern argument
+                if (endpoint.HttpMethod != "MapFallback" || endpoint.Operation.Arguments.Length != 2)
+                {
+                    codeWriter.WriteLine(@"[StringSyntax(""Route"")] string pattern,");
+                }
+                // MapMethods overloads define an additional `httpMethods` parameter
+                if (endpoint.HttpMethod == "MapMethods")
+                {
+                    codeWriter.WriteLine("IEnumerable<string> httpMethods,");
+                }
+                codeWriter.WriteLine("Delegate handler)");
+                codeWriter.Indent--;
+                codeWriter.StartBlock();
+                codeWriter.WriteLine("MetadataPopulator populateMetadata = (methodInfo, options) =>");
+                codeWriter.StartBlock();
+                codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");");
+                codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");");
+                codeWriter.WriteLine($"options.EndpointBuilder.Metadata.Add(new {RequestDelegateGeneratorSources.GeneratedCodeConstructor});");
+                endpoint.EmitEndpointMetadataPopulation(codeWriter);
+                codeWriter.WriteLine("return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };");
+                codeWriter.EndBlockWithSemicolon();
+                codeWriter.WriteLine("RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>");
+                codeWriter.StartBlock();
+                codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");");
+                codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");");
+                codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.ApplicationServices != null, ""ApplicationServices not found."");");
+                codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.FilterFactories != null, ""FilterFactories not found."");");
+                codeWriter.WriteLine($"var handler = Cast(del, {endpoint.EmitHandlerDelegateType(considerOptionality: true)} => throw null!);");
+                codeWriter.WriteLine("EndpointFilterDelegate? filteredInvocation = null;");
+                codeWriter.WriteLine("var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;");
+                endpoint.EmitLoggingPreamble(codeWriter);
+                endpoint.EmitJsonPreparation(codeWriter);
+                endpoint.EmitRouteOrQueryResolver(codeWriter);
+                endpoint.EmitJsonBodyOrServiceResolver(codeWriter);
+                if (endpoint.NeedsParameterArray)
+                {
+                    codeWriter.WriteLine("var parameters = del.Method.GetParameters();");
+                }
+                codeWriter.WriteLineNoTabs(string.Empty);
+                codeWriter.WriteLine("if (options.EndpointBuilder.FilterFactories.Count > 0)");
+                codeWriter.StartBlock();
+                codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true
+                    ? "filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic =>"
+                    : "filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>");
+                codeWriter.StartBlock();
+                codeWriter.WriteLine("if (ic.HttpContext.Response.StatusCode == 400)");
+                codeWriter.StartBlock();
+                codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true
+                    ? "return (object?)Results.Empty;"
+                    : "return ValueTask.FromResult<object?>(Results.Empty);");
+                codeWriter.EndBlock();
+                endpoint.EmitFilteredInvocation(codeWriter);
+                codeWriter.EndBlockWithComma();
+                codeWriter.WriteLine("options.EndpointBuilder,");
+                codeWriter.WriteLine("handler.Method);");
+                codeWriter.EndBlock();
+                codeWriter.WriteLineNoTabs(string.Empty);
+                endpoint.EmitRequestHandler(codeWriter);
+                codeWriter.WriteLineNoTabs(string.Empty);
+                endpoint.EmitFilteredRequestHandler(codeWriter);
+                codeWriter.WriteLineNoTabs(string.Empty);
+                codeWriter.WriteLine("RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;");
+                codeWriter.WriteLine("var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;");
+                codeWriter.WriteLine("return new RequestDelegateResult(targetDelegate, metadata);");
+                codeWriter.EndBlockWithSemicolon();
+                codeWriter.WriteLine("return MapCore(");
+                codeWriter.Indent++;
+                codeWriter.WriteLine("endpoints,");
+                // For `MapFallback` overloads that only take a delegate, provide the assumed default
+                // Otherwise, pass the pattern provided from the MapX invocation
+                if (endpoint.HttpMethod != "MapFallback" && endpoint.Operation.Arguments.Length != 2)
+                {
+                    codeWriter.WriteLine("pattern,");
+                }
+                else
+                {
+                    codeWriter.WriteLine($"{SymbolDisplay.FormatLiteral("{*path:nonfile}", true)},");
+                }
+                codeWriter.WriteLine("handler,");
+                codeWriter.WriteLine($"{endpoint.EmitVerb()},");
+                codeWriter.WriteLine("populateMetadata,");
+                codeWriter.WriteLine("createRequestDelegate);");
+                codeWriter.Indent--;
+                codeWriter.EndBlock();
                 return stringWriter.ToString();
             });
 
@@ -272,32 +256,23 @@ public sealed class RequestDelegateGenerator : IIncrementalGenerator
                 return stringWriter.ToString();
             });
 
-        var thunksAndEndpoints = thunks
-            .Collect()
-            .Combine(stronglyTypedEndpointDefinitions)
-            .Combine(httpVerbs)
-            .Combine(endpointHelpers)
-            .Combine(helperTypes);
+        var endpointsAndHelpers = interceptorDefinitions.Collect().Combine(endpointHelpers).Combine(httpVerbs).Combine(helperTypes);
 
-        context.RegisterSourceOutput(thunksAndEndpoints, (context, sources) =>
+        context.RegisterSourceOutput(endpointsAndHelpers, (context, sources) =>
         {
-            var ((((thunks, endpointsCode), httpVerbs), helperMethods), helperTypes) = sources;
-
-            if (thunks.IsDefaultOrEmpty || string.IsNullOrEmpty(endpointsCode))
+            var (((endpointsCode, helperMethods), httpVerbs), helperTypes) = sources;
+            if (endpointsCode.IsDefaultOrEmpty)
             {
                 return;
             }
-
-            var thunksCode = new StringBuilder();
-            foreach (var thunk in thunks)
+            using var stringWriter = new StringWriter(CultureInfo.InvariantCulture);
+            using var codeWriter = new CodeWriter(stringWriter, baseIndent: 2);
+            foreach (var endpoint in endpointsCode)
             {
-                thunksCode.AppendLine(thunk);
+                codeWriter.WriteLine(endpoint);
             }
-
             var code = RequestDelegateGeneratorSources.GetGeneratedRouteBuilderExtensionsSource(
-                genericThunks: string.Empty,
-                thunks: thunksCode.ToString(),
-                endpoints: endpointsCode,
+                endpoints: stringWriter.ToString(),
                 helperMethods: helperMethods ?? string.Empty,
                 helperTypes: helperTypes ?? string.Empty,
                 verbs: httpVerbs);

+ 30 - 85
src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs

@@ -1,6 +1,7 @@
 // Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
+using System;
 using System.Collections.Immutable;
 using System.Linq;
 using System.Text;
@@ -21,7 +22,8 @@ internal static class RequestDelegateGeneratorSources
 #nullable enable
 """;
 
-    public static string GeneratedCodeAttribute => $@"[System.CodeDom.Compiler.GeneratedCodeAttribute(""{typeof(RequestDelegateGeneratorSources).Assembly.FullName}"", ""{typeof(RequestDelegateGeneratorSources).Assembly.GetName().Version}"")]";
+    public static string GeneratedCodeConstructor => $@"System.CodeDom.Compiler.GeneratedCodeAttribute(""{typeof(RequestDelegateGeneratorSources).Assembly.FullName}"", ""{typeof(RequestDelegateGeneratorSources).Assembly.GetName().Version}"")";
+    public static string GeneratedCodeAttribute => $"[{GeneratedCodeConstructor}]";
 
     public static string ContentTypeConstantsType => $$"""
     {{GeneratedCodeAttribute}}
@@ -439,25 +441,19 @@ internal static class RequestDelegateGeneratorSources
     }
 """;
 
-    public static string GetGeneratedRouteBuilderExtensionsSource(string genericThunks, string thunks, string endpoints, string helperMethods, string helperTypes, ImmutableHashSet<string> verbs) => $$"""
+    public static string GetGeneratedRouteBuilderExtensionsSource(string endpoints, string helperMethods, string helperTypes, ImmutableHashSet<string> verbs) => $$"""
 {{SourceHeader}}
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     {{GeneratedCodeAttribute}}
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-{{GetEndpoints(endpoints, verbs)}}
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -471,6 +467,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -493,8 +490,24 @@ namespace Microsoft.AspNetCore.Http.Generated
     {{GeneratedCodeAttribute}}
     file static class GeneratedRouteBuilderExtensionsCore
     {
-{{GetGenericThunks(genericThunks)}}
-{{GetThunks(thunks)}}
+        {{GetVerbs(verbs)}}
+        {{endpoints}}
+
+        internal static RouteHandlerBuilder MapCore(
+            this IEndpointRouteBuilder routes,
+            string pattern,
+            Delegate handler,
+            IEnumerable<string>? httpMethods,
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
+        {
+            return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
+        }
+
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
 
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
@@ -557,84 +570,16 @@ namespace Microsoft.AspNetCore.Http.Generated
 {{LogOrThrowExceptionHelperClass}}
 }
 """;
-    private static string GetGenericThunks(string genericThunks) => genericThunks != string.Empty ? $$"""
-        private static class GenericThunks<T>
-        {
-            public static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
-            {
-                {{genericThunks}}
-            };
-        }
 
-        internal static RouteHandlerBuilder MapCore<T>(
-            this IEndpointRouteBuilder routes,
-            string pattern,
-            Delegate handler,
-            IEnumerable<string> httpMethods,
-            string filePath,
-            int lineNumber)
-        {
-            var (populateMetadata, createRequestDelegate) = GenericThunks<T>.map[(filePath, lineNumber)];
-            return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
-        }
-""" : string.Empty;
-
-    private static string GetThunks(string thunks) => thunks != string.Empty ? $$"""
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
-        {
-{{thunks}}
-        };
-
-        internal static RouteHandlerBuilder MapCore(
-            this IEndpointRouteBuilder routes,
-            string pattern,
-            Delegate handler,
-            IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
-        {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
-            return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
-        }
-""" : string.Empty;
-
-    private static string GetEndpoints(string endpoints, ImmutableHashSet<string> verbs)
+    public static string GetVerbs(ImmutableHashSet<string> verbs)
     {
-        if (endpoints == string.Empty)
-        {
-            return string.Empty;
-        }
-
         var builder = new StringBuilder();
-        builder.Append($$"""
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    {{GeneratedCodeAttribute}}
-    internal static class GenerateRouteBuilderEndpoints
-    {
-
-""");
 
-        foreach (string verb in verbs.OrderBy(p => p, System.StringComparer.Ordinal))
+        foreach (string verb in verbs.OrderBy(p => p, StringComparer.Ordinal))
         {
-            builder.AppendLine($$"""
-        private static readonly string[] {{verb}}Verb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.{{verb}} };
-""");
+            builder.AppendLine($$"""private static readonly string[] {{verb}}Verb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.{{verb}} };""");
         }
 
-        if (verbs.Count > 0)
-        {
-            builder.AppendLine();
-        }
-
-        builder.Append($$"""
-        {{endpoints}}
-    }
-""");
-
         return builder.ToString();
     }
 }

+ 74 - 0
src/Http/Http.Extensions/gen/RequestDelegateGeneratorSuppressor.cs

@@ -0,0 +1,74 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Immutable;
+using System.Linq;
+using Microsoft.AspNetCore.App.Analyzers.Infrastructure;
+using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Microsoft.CodeAnalysis.Diagnostics;
+using Microsoft.CodeAnalysis.Operations;
+
+/*
+ * This class contains the logic for suppressing diagnostics that are
+ * emitted by the linker analyzers when encountering the framework-provided
+ * `Map` invocations. Pending the completion of https://github.com/dotnet/roslyn/issues/68669,
+ * this workaround is necessary to apply these suppressions for `Map` invocations that the RDG
+ * is able to generate code at compile time for that the analyzer is not able to resolve.
+ */
+
+namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator;
+
+[DiagnosticAnalyzer(LanguageNames.CSharp)]
+public sealed class RequestDelegateGeneratorSuppressor : DiagnosticSuppressor
+{
+    private static readonly SuppressionDescriptor SuppressRUCDiagnostic = new(
+        id: "RDGS001",
+        suppressedDiagnosticId: "IL2026",
+        justification: "The target method has been intercepted by a statically generated variant.");
+
+    private static readonly SuppressionDescriptor SuppressRDCDiagnostic = new(
+        id: "RDGS002",
+        suppressedDiagnosticId: "IL3050",
+        justification: "The target method has been intercepted by a statically generated variant.");
+
+    public override void ReportSuppressions(SuppressionAnalysisContext context)
+    {
+        foreach (var diagnostic in context.ReportedDiagnostics)
+        {
+            if (diagnostic.Id != SuppressRDCDiagnostic.SuppressedDiagnosticId && diagnostic.Id != SuppressRUCDiagnostic.SuppressedDiagnosticId)
+            {
+                continue;
+            }
+
+            var location = diagnostic.AdditionalLocations.Count > 0
+                ? diagnostic.AdditionalLocations[0]
+                : diagnostic.Location;
+
+            if (location.SourceTree is not { } sourceTree
+                || sourceTree.GetRoot().FindNode(location.SourceSpan) is not InvocationExpressionSyntax node
+                || !node.TryGetMapMethodName(out var method)
+                || !InvocationOperationExtensions.KnownMethods.Contains(method))
+            {
+                continue;
+            }
+
+            var semanticModel = context.GetSemanticModel(sourceTree);
+            var operation = semanticModel.GetOperation(node, context.CancellationToken);
+            var wellKnownTypes = WellKnownTypes.GetOrCreate(semanticModel.Compilation);
+            if (operation.IsValidOperation(wellKnownTypes, out var invocationOperation))
+            {
+                var endpoint = new Endpoint(invocationOperation, wellKnownTypes, semanticModel);
+                if (endpoint.Diagnostics.Count == 0)
+                {
+                    var targetSuppression = diagnostic.Id == SuppressRUCDiagnostic.SuppressedDiagnosticId
+                        ? SuppressRUCDiagnostic
+                        : SuppressRDCDiagnostic;
+                    context.ReportSuppression(Suppression.Create(targetSuppression, diagnostic));
+                }
+            }
+        }
+    }
+    public override ImmutableArray<SuppressionDescriptor> SupportedSuppressions => ImmutableArray.Create(SuppressRUCDiagnostic, SuppressRDCDiagnostic);
+}

+ 7 - 4
src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Endpoint.cs

@@ -95,7 +95,7 @@ internal class Endpoint
     public EndpointParameter[] Parameters { get; } = Array.Empty<EndpointParameter>();
     public List<Diagnostic> Diagnostics { get; } = new List<Diagnostic>();
 
-    public (string File, int LineNumber) Location { get; }
+    public (string File, int LineNumber, int CharacterNumber) Location { get; }
     public IInvocationOperation Operation { get; }
 
     public override bool Equals(object o) =>
@@ -138,13 +138,16 @@ internal class Endpoint
         return hashCode.ToHashCode();
     }
 
-    private static (string, int) GetLocation(IInvocationOperation operation)
+    private static (string, int, int) GetLocation(IInvocationOperation operation)
     {
         var operationSpan = operation.Syntax.Span;
-        var filePath = operation.Syntax.SyntaxTree.GetDisplayPath(operationSpan, operation.SemanticModel?.Compilation.Options.SourceReferenceResolver);
+        var filePath = operation.Syntax.SyntaxTree.GetInterceptorFilePath(operation.SemanticModel?.Compilation.Options.SourceReferenceResolver);
         var span = operation.Syntax.SyntaxTree.GetLineSpan(operationSpan);
         var lineNumber = span.StartLinePosition.Line + 1;
-        return (filePath, lineNumber);
+        // Calculate the character offset to the end of the Map invocation detected
+        var invocationLength = ((MemberAccessExpressionSyntax)((InvocationExpressionSyntax)operation.Syntax).Expression).Expression.Span.Length;
+        var characterNumber = span.StartLinePosition.Character + invocationLength + 2;
+        return (filePath, lineNumber, characterNumber);
     }
 
     private static string GetHttpMethod(IInvocationOperation operation)

+ 6 - 3
src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs

@@ -23,6 +23,7 @@ internal class EndpointParameter
     {
         Ordinal = parameter.Ordinal;
         IsOptional = parameter.IsOptional();
+        HasDefaultValue = parameter.HasExplicitDefaultValue;
         DefaultValue = parameter.GetDefaultValueString();
         ProcessEndpointParameterSource(endpoint, parameter, parameter.GetAttributes(), wellKnownTypes);
     }
@@ -32,6 +33,7 @@ internal class EndpointParameter
         Ordinal = parameter?.Ordinal ?? 0;
         IsProperty = true;
         IsOptional = property.IsOptional() || parameter?.IsOptional() == true;
+        HasDefaultValue = parameter?.HasExplicitDefaultValue ?? false;
         DefaultValue = parameter?.GetDefaultValueString() ?? "null";
         // Coalesce attributes on the property and attributes on the matching parameter
         var attributeBuilder = ImmutableArray.CreateBuilder<AttributeData>();
@@ -251,6 +253,7 @@ internal class EndpointParameter
     public bool IsOptional { get; set; }
     public bool IsArray { get; set; }
     public string DefaultValue { get; set; } = "null";
+    public bool HasDefaultValue { get; set; }
     [MemberNotNullWhen(true, nameof(PropertyAsParameterInfoConstruction))]
     public bool IsProperty { get; set; }
     public EndpointParameterSource Source { get; set; }
@@ -610,17 +613,17 @@ internal class EndpointParameter
         other.SymbolName == SymbolName &&
         other.Ordinal == Ordinal &&
         other.IsOptional == IsOptional &&
-        SymbolEqualityComparer.Default.Equals(other.Type, Type);
+        SymbolEqualityComparer.IncludeNullability.Equals(other.Type, Type);
 
     public bool SignatureEquals(object obj) =>
         obj is EndpointParameter other &&
-        SymbolEqualityComparer.Default.Equals(other.Type, Type);
+        SymbolEqualityComparer.IncludeNullability.Equals(other.Type, Type);
 
     public override int GetHashCode()
     {
         var hashCode = new HashCode();
         hashCode.Add(SymbolName);
-        hashCode.Add(Type, SymbolEqualityComparer.Default);
+        hashCode.Add(Type, SymbolEqualityComparer.IncludeNullability);
         return hashCode.ToHashCode();
     }
 }

+ 15 - 0
src/Http/Http.Extensions/gen/StaticRouteHandlerModel/InvocationOperationExtensions.cs

@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 
 using System.Diagnostics.CodeAnalysis;
+using Microsoft.AspNetCore.App.Analyzers.Infrastructure;
 using Microsoft.CodeAnalysis;
 using Microsoft.CodeAnalysis.CSharp.Syntax;
 using Microsoft.CodeAnalysis.Operations;
@@ -22,6 +23,20 @@ internal static class InvocationOperationExtensions
         "MapFallback"
     };
 
+    public static bool IsValidOperation(this IOperation? operation, WellKnownTypes wellKnownTypes, [NotNullWhen(true)] out IInvocationOperation? invocationOperation)
+    {
+        invocationOperation = null;
+        if (operation is IInvocationOperation targetOperation &&
+            targetOperation.TryGetRouteHandlerArgument(out var routeHandlerParameter) &&
+            routeHandlerParameter is { Parameter.Type: {} delegateType } &&
+            SymbolEqualityComparer.Default.Equals(delegateType, wellKnownTypes.Get(WellKnownTypeData.WellKnownType.System_Delegate)))
+        {
+            invocationOperation = targetOperation;
+            return true;
+        }
+        return false;
+    }
+
     public static bool TryGetRouteHandlerMethod(this IInvocationOperation invocation, SemanticModel semanticModel, [NotNullWhen(true)] out IMethodSymbol? method)
     {
         method = null;

+ 16 - 6
src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs

@@ -14,19 +14,29 @@ internal static class StaticRouteHandlerModelEmitter
 {
     public static string EmitHandlerDelegateType(this Endpoint endpoint, bool considerOptionality = false)
     {
+        // Emits a delegate type to use when casting the input that captures
+        // default parameter values.
+        //
+        // void (int arg0, Todo arg1) => throw null!
+        // IResult (int arg0, Todo arg1) => throw null!
         if (endpoint.Parameters.Length == 0)
         {
-            return endpoint.Response == null || (endpoint.Response.HasNoResponse && !endpoint.Response.IsAwaitable) ? "System.Action" : $"System.Func<{endpoint.Response.WrappedResponseType}>";
+            return endpoint.Response == null || (endpoint.Response.HasNoResponse && !endpoint.Response.IsAwaitable) ? "void ()" : $"{endpoint.Response.WrappedResponseType} ()";
         }
-        var parameterTypeList = string.Join(", ", endpoint.Parameters.Select(p => considerOptionality
-            ? p.Type.ToDisplayString(p.IsOptional ? NullableFlowState.MaybeNull : NullableFlowState.NotNull, EmitterConstants.DisplayFormat)
-            : p.Type.ToDisplayString(EmitterConstants.DisplayFormat)));
+        var parameterTypeList = string.Join(", ", endpoint.Parameters.Select((p, i) => $"{getType(p, considerOptionality)} arg{i}{(p.HasDefaultValue ? $"= {p.DefaultValue}" : string.Empty)}"));
 
         if (endpoint.Response == null || (endpoint.Response.HasNoResponse && !endpoint.Response.IsAwaitable))
         {
-            return $"System.Action<{parameterTypeList}>";
+            return $"void ({parameterTypeList})";
+        }
+        return $"{endpoint.Response.WrappedResponseType} ({parameterTypeList})";
+
+        static string getType(EndpointParameter p, bool considerOptionality)
+        {
+            return considerOptionality
+                ? p.Type.ToDisplayString(p.IsOptional ? NullableFlowState.MaybeNull : NullableFlowState.NotNull, EmitterConstants.DisplayFormat)
+                : p.Type.ToDisplayString(EmitterConstants.DisplayFormat);
         }
-        return $"System.Func<{parameterTypeList}, {endpoint.Response.WrappedResponseType}>";
     }
 
     public static string EmitSourceKey(this Endpoint endpoint)

+ 1926 - 1960
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt

@@ -8,332 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -348,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -370,1856 +54,2138 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncRecord", "myBindAsyncParam", "MyBindAsyncRecord.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord)myBindAsyncParam_temp;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncRecord", "myBindAsyncParam", "MyBindAsyncRecord.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    else
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncRecord", "myBindAsyncParam", "MyBindAsyncRecord.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord)myBindAsyncParam_temp;
-                        }
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord)myBindAsyncParam_temp;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 26)] = (
-                (methodInfo, options) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 26));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncRecord", "myBindAsyncParam", "MyBindAsyncRecord.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
                     }
-
-                    async Task RequestHandler(HttpContext httpContext)
+                    else
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord)myBindAsyncParam_temp;
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 27)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 27));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 26, 5)]
+        internal static RouteHandlerBuilder MapGet1(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncStruct", "myBindAsyncParam", "MyBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct)myBindAsyncParam_temp;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
-                    }
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?)myBindAsyncParam_temp;
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncStruct", "myBindAsyncParam", "MyBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct)myBindAsyncParam_temp;
-                        }
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 28)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 28));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?)myBindAsyncParam_temp;
 
-                    async Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                        httpContext.Response.StatusCode = 400;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 29)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 29));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 27, 5)]
+        internal static RouteHandlerBuilder MapGet2(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncStruct", "myBindAsyncParam", "MyBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    else
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp;
-                        }
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct)myBindAsyncParam_temp;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
                     }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 30)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 30));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncStruct", "myBindAsyncParam", "MyBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct)myBindAsyncParam_temp;
                     }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp;
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 28, 5)]
+        internal static RouteHandlerBuilder MapGet3(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                        await httpContext.Response.WriteAsync(result);
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?)myBindAsyncParam_temp;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?)myBindAsyncParam_temp;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp;
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 29, 5)]
+        internal static RouteHandlerBuilder MapGet4(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp;
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 31)] = (
-                (methodInfo, options) =>
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 31));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp;
+                    }
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 30, 5)]
+        internal static RouteHandlerBuilder MapGet5(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBothBindAsyncStruct", "myBindAsyncParam", "MyBothBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct)myBindAsyncParam_temp;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp;
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBothBindAsyncStruct", "myBindAsyncParam", "MyBothBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct)myBindAsyncParam_temp;
-                        }
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 31, 5)]
+        internal static RouteHandlerBuilder MapGet6(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 32)] = (
-                (methodInfo, options) =>
+                async Task RequestHandler(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 32));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBothBindAsyncStruct", "myBindAsyncParam", "MyBothBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct)myBindAsyncParam_temp;
+                    }
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBothBindAsyncStruct", "myBindAsyncParam", "MyBothBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct)myBindAsyncParam_temp;
                     }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp;
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 32, 5)]
+        internal static RouteHandlerBuilder MapGet7(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                        await httpContext.Response.WriteAsync(result);
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    await httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp;
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp;
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 33, 5)]
+        internal static RouteHandlerBuilder MapGet8(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncRecord", "myBindAsyncParam", "MySimpleBindAsyncRecord.BindAsync(HttpContext)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord)myBindAsyncParam_temp;
+                    }
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
                     }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 33)] = (
-                (methodInfo, options) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 33));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncRecord", "myBindAsyncParam", "MySimpleBindAsyncRecord.BindAsync(HttpContext)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord)myBindAsyncParam_temp;
+                    }
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 34, 5)]
+        internal static RouteHandlerBuilder MapGet9(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncRecord", "myBindAsyncParam", "MySimpleBindAsyncRecord.BindAsync(HttpContext)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord)myBindAsyncParam_temp;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp;
+
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncRecord", "myBindAsyncParam", "MySimpleBindAsyncRecord.BindAsync(HttpContext)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord)myBindAsyncParam_temp;
-                        }
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 35, 5)]
+        internal static RouteHandlerBuilder MapGet10(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 34)] = (
-                (methodInfo, options) =>
+                async Task RequestHandler(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 34));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncStruct", "myBindAsyncParam", "MySimpleBindAsyncStruct.BindAsync(HttpContext)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp;
+                    }
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncStruct", "myBindAsyncParam", "MySimpleBindAsyncStruct.BindAsync(HttpContext)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp;
                     }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp;
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 36, 5)]
+        internal static RouteHandlerBuilder MapGet11(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                        await httpContext.Response.WriteAsync(result);
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?)myBindAsyncParam_temp;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
                     }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?)myBindAsyncParam_temp;
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp;
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 37, 5)]
+        internal static RouteHandlerBuilder MapGet12(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromImplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromImplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface)myBindAsyncParam_temp;
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 35)] = (
-                (methodInfo, options) =>
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 35));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromImplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromImplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface)myBindAsyncParam_temp;
+                    }
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 38, 5)]
+        internal static RouteHandlerBuilder MapGet13(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncStruct", "myBindAsyncParam", "MySimpleBindAsyncStruct.BindAsync(HttpContext)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?)myBindAsyncParam_temp;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
                     }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?)myBindAsyncParam_temp;
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncStruct", "myBindAsyncParam", "MySimpleBindAsyncStruct.BindAsync(HttpContext)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp;
-                        }
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                        if (wasParamCheckFailure)
+        [InterceptsLocation(@"TestMapActions.cs", 39, 5)]
+        internal static RouteHandlerBuilder MapGet14(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            httpContext.Response.StatusCode = 400;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("InheritBindAsync", "myBindAsyncParam", "InheritBindAsync.BindAsync(HttpContext)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp;
+                    }
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("InheritBindAsync", "myBindAsyncParam", "InheritBindAsync.BindAsync(HttpContext)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp;
+                    }
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 40, 5)]
+        internal static RouteHandlerBuilder MapGet15(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 36)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 36));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandler(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?)myBindAsyncParam_temp;
 
-                    async Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 37)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 37));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromImplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromImplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface)myBindAsyncParam_temp;
-                        }
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?)myBindAsyncParam_temp;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromImplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromImplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface)myBindAsyncParam_temp;
-                        }
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 41, 5)]
+        internal static RouteHandlerBuilder MapGet16(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 38)] = (
-                (methodInfo, options) =>
+                async Task RequestHandler(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 38));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromExplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromExplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
                     }
-
-                    async Task RequestHandler(HttpContext httpContext)
+                    else
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface)myBindAsyncParam_temp;
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface>(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 39)] = (
-                (methodInfo, options) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 39));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("InheritBindAsync", "myBindAsyncParam", "InheritBindAsync.BindAsync(HttpContext)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp;
-                        }
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, parameters[1]);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromExplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromExplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
+                    }
+                    else
+                    {
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface)myBindAsyncParam_temp;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+        [InterceptsLocation(@"TestMapActions.cs", 42, 5)]
+        internal static RouteHandlerBuilder MapGet17(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var parameters = del.Method.GetParameters();
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("InheritBindAsync", "myBindAsyncParam", "InheritBindAsync.BindAsync(HttpContext)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?)myBindAsyncParam_temp;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 40)] = (
-                (methodInfo, options) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 40));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, parameters[0]);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?)myBindAsyncParam_temp;
 
-                    async Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                        httpContext.Response.StatusCode = 400;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 41)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 41));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 43, 5)]
+        internal static RouteHandlerBuilder MapGet18(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromExplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromExplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface)myBindAsyncParam_temp;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>.BindAsync(httpContext);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncFromInterfaceRecord", "myBindAsyncParam", "MyBindAsyncFromInterfaceRecord.BindAsync(HttpContext)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    else
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, parameters[1]);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromExplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromExplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface)myBindAsyncParam_temp;
-                        }
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord)myBindAsyncParam_temp;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(httpContext_local, myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 42)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 42));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var parameters = del.Method.GetParameters();
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>.BindAsync(httpContext);
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord myBindAsyncParam_local;
+                    if ((object?)myBindAsyncParam_temp == null)
+                    {
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncFromInterfaceRecord", "myBindAsyncParam", "MyBindAsyncFromInterfaceRecord.BindAsync(HttpContext)");
+                        wasParamCheckFailure = true;
+                        myBindAsyncParam_local = default!;
                     }
-
-                    async Task RequestHandler(HttpContext httpContext)
+                    else
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                        myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord)myBindAsyncParam_temp;
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await BindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface>(httpContext, parameters[0]);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>(httpContext, httpContext_local, myBindAsyncParam_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 43)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 43));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 44, 5)]
+        internal static RouteHandlerBuilder MapGet19(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>.BindAsync(httpContext);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncFromInterfaceRecord", "myBindAsyncParam", "MyBindAsyncFromInterfaceRecord.BindAsync(HttpContext)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord)myBindAsyncParam_temp;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(httpContext_local, myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
-                    }
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>.BindAsync(httpContext);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?)myBindAsyncParam_temp;
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>.BindAsync(httpContext);
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord myBindAsyncParam_local;
-                        if ((object?)myBindAsyncParam_temp == null)
-                        {
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncFromInterfaceRecord", "myBindAsyncParam", "MyBindAsyncFromInterfaceRecord.BindAsync(HttpContext)");
-                            wasParamCheckFailure = true;
-                            myBindAsyncParam_local = default!;
-                        }
-                        else
-                        {
-                            myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord)myBindAsyncParam_temp;
-                        }
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>(httpContext, httpContext_local, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(myBindAsyncParam_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
                     }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 44)] = (
-                (methodInfo, options) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 44));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                    var wasParamCheckFailure = false;
+                    var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>.BindAsync(httpContext);
+                    var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?)myBindAsyncParam_temp;
 
-                    async Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>.BindAsync(httpContext);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(myBindAsyncParam_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                        httpContext.Response.StatusCode = 400;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?>(httpContext, myBindAsyncParam_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord>.BindAsync(httpContext);
-                        var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?)myBindAsyncParam_temp;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?>(httpContext, myBindAsyncParam_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 183 - 184
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo, global::Microsoft.AspNetCore.Http.HttpResults.Ok<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                PostVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,192 +54,222 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapPost0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: false, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.HttpResults.Ok<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>>(methodInfo, options.EndpointBuilder);
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: false, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.HttpResults.Ok<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>>(methodInfo, options.EndpointBuilder);
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::Microsoft.AspNetCore.Http.HttpResults.Ok<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo> (global::Microsoft.AspNetCore.Http.Generators.Tests.Todo arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var todo_JsonTypeInfo =  (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo, global::Microsoft.AspNetCore.Http.HttpResults.Ok<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var todo_JsonTypeInfo =  (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBody)
+                    var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo", todo_JsonTypeInfo);
+                    var todo_local = todo_resolveBodyResult.Item2;
+                    if (!todo_resolveBodyResult.Item1)
+                    {
+                        return;
                     }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBody)
-                        var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo", todo_JsonTypeInfo);
-                        var todo_local = todo_resolveBodyResult.Item2;
-                        if (!todo_resolveBodyResult.Item1)
-                        {
-                            return;
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(todo_local!);
+                    await GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(todo_local!);
-                        await GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext);
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBody)
+                    var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo", todo_JsonTypeInfo);
+                    var todo_local = todo_resolveBodyResult.Item2;
+                    if (!todo_resolveBodyResult.Item1)
+                    {
+                        return;
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBody)
-                        var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo", todo_JsonTypeInfo);
-                        var todo_local = todo_resolveBodyResult.Item2;
-                        if (!todo_resolveBodyResult.Item1)
-                        {
-                            return;
-                        }
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(httpContext, todo_local!));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(httpContext, todo_local!));
-                        if (result is not null)
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                PostVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 27, 5)]
+        internal static RouteHandlerBuilder MapPost1(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: true, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.HttpResults.Ok<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>>(methodInfo, options.EndpointBuilder);
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::Microsoft.AspNetCore.Http.HttpResults.Ok<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo> (global::Microsoft.AspNetCore.Http.Generators.Tests.Todo? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var todo_JsonTypeInfo =  (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 27)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 27));
-                    options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: true, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.HttpResults.Ok<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>>(methodInfo, options.EndpointBuilder);
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandler(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?, global::Microsoft.AspNetCore.Http.HttpResults.Ok<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var todo_JsonTypeInfo =  (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo?, IsOptional = True, IsParsable = False, IsArray = False, Source = JsonBody)
+                    var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo", todo_JsonTypeInfo);
+                    var todo_local = todo_resolveBodyResult.Item2;
+                    if (!todo_resolveBodyResult.Item1)
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        return;
                     }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo?, IsOptional = True, IsParsable = False, IsArray = False, Source = JsonBody)
-                        var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo", todo_JsonTypeInfo);
-                        var todo_local = todo_resolveBodyResult.Item2;
-                        if (!todo_resolveBodyResult.Item1)
-                        {
-                            return;
-                        }
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(todo_local);
-                        await GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext);
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
+                    var result = handler(todo_local);
+                    await GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo?, IsOptional = True, IsParsable = False, IsArray = False, Source = JsonBody)
+                    var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo", todo_JsonTypeInfo);
+                    var todo_local = todo_resolveBodyResult.Item2;
+                    if (!todo_resolveBodyResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo?, IsOptional = True, IsParsable = False, IsArray = False, Source = JsonBody)
-                        var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo", todo_JsonTypeInfo);
-                        var todo_local = todo_resolveBodyResult.Item2;
-                        if (!todo_resolveBodyResult.Item1)
-                        {
-                            return;
-                        }
+                        return;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>(httpContext, todo_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>(httpContext, todo_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                PostVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 109 - 124
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,127 +54,143 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Header)
+                    var p_raw = httpContext.Request.Headers["p"];
+                    var p_temp = p_raw.ToArray();
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
+                    for (var i = 0; i < p_temp.Length; i++)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Header)
-                        var p_raw = httpContext.Request.Headers["p"];
-                        var p_temp = p_raw.ToArray();
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
-                        for (var i = 0; i < p_temp.Length; i++)
+                        var element = p_temp[i];
+                        if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
                         {
-                            var element = p_temp[i];
-                            if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
+                            if (!string.IsNullOrEmpty(element))
                             {
-                                if (!string.IsNullOrEmpty(element))
-                                {
-                                    logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
-                                    wasParamCheckFailure = true;
-                                }
+                                logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
+                                wasParamCheckFailure = true;
                             }
-                            p_local[i] = parsed_element!;
                         }
+                        p_local[i] = parsed_element!;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local);
-                        return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
+                    var result = handler(p_local);
+                    return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Header)
+                    var p_raw = httpContext.Request.Headers["p"];
+                    var p_temp = p_raw.ToArray();
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
+                    for (var i = 0; i < p_temp.Length; i++)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Header)
-                        var p_raw = httpContext.Request.Headers["p"];
-                        var p_temp = p_raw.ToArray();
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
-                        for (var i = 0; i < p_temp.Length; i++)
+                        var element = p_temp[i];
+                        if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
                         {
-                            var element = p_temp[i];
-                            if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
+                            if (!string.IsNullOrEmpty(element))
                             {
-                                if (!string.IsNullOrEmpty(element))
-                                {
-                                    logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
-                                    wasParamCheckFailure = true;
-                                }
+                                logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
+                                wasParamCheckFailure = true;
                             }
-                            p_local[i] = parsed_element!;
                         }
+                        p_local[i] = parsed_element!;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(httpContext, p_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 93 - 108
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String?[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,101 +54,117 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String?[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header)
-                        var p_raw = httpContext.Request.Headers["p"];
-                        var p_temp = p_raw.ToArray();
-                        string[] p_local = p_temp!;
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header)
+                    var p_raw = httpContext.Request.Headers["p"];
+                    var p_temp = p_raw.ToArray();
+                    string[] p_local = p_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local);
-                        return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
+                    var result = handler(p_local);
+                    return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header)
-                        var p_raw = httpContext.Request.Headers["p"];
-                        var p_temp = p_raw.ToArray();
-                        string[] p_local = p_temp!;
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header)
+                    var p_raw = httpContext.Request.Headers["p"];
+                    var p_temp = p_raw.ToArray();
+                    string[] p_local = p_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 93 - 108
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,101 +54,117 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header)
-                        var p_raw = httpContext.Request.Headers["p"];
-                        var p_temp = p_raw.ToArray();
-                        string[] p_local = p_temp!;
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header)
+                    var p_raw = httpContext.Request.Headers["p"];
+                    var p_temp = p_raw.ToArray();
+                    string[] p_local = p_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local);
-                        return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
+                    var result = handler(p_local);
+                    return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header)
-                        var p_raw = httpContext.Request.Headers["p"];
-                        var p_temp = p_raw.ToArray();
-                        string[] p_local = p_temp!;
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header)
+                    var p_raw = httpContext.Request.Headers["p"];
+                    var p_temp = p_raw.ToArray();
+                    string[] p_local = p_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 109 - 124
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,127 +54,143 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    var p_temp = p_raw.ToArray();
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
+                    for (var i = 0; i < p_temp.Length; i++)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        var p_temp = p_raw.ToArray();
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
-                        for (var i = 0; i < p_temp.Length; i++)
+                        var element = p_temp[i];
+                        if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
                         {
-                            var element = p_temp[i];
-                            if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
+                            if (!string.IsNullOrEmpty(element))
                             {
-                                if (!string.IsNullOrEmpty(element))
-                                {
-                                    logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
-                                    wasParamCheckFailure = true;
-                                }
+                                logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
+                                wasParamCheckFailure = true;
                             }
-                            p_local[i] = parsed_element!;
                         }
+                        p_local[i] = parsed_element!;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local);
-                        return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
+                    var result = handler(p_local);
+                    return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    var p_temp = p_raw.ToArray();
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
+                    for (var i = 0; i < p_temp.Length; i++)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        var p_temp = p_raw.ToArray();
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
-                        for (var i = 0; i < p_temp.Length; i++)
+                        var element = p_temp[i];
+                        if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
                         {
-                            var element = p_temp[i];
-                            if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
+                            if (!string.IsNullOrEmpty(element))
                             {
-                                if (!string.IsNullOrEmpty(element))
-                                {
-                                    logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
-                                    wasParamCheckFailure = true;
-                                }
+                                logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
+                                wasParamCheckFailure = true;
                             }
-                            p_local[i] = parsed_element!;
                         }
+                        p_local[i] = parsed_element!;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(httpContext, p_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 92 - 107
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String?[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,100 +54,116 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String?[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        var p_temp = p_raw.ToArray();
-                        string[] p_local = p_temp!;
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    var p_temp = p_raw.ToArray();
+                    string[] p_local = p_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local);
-                        return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
+                    var result = handler(p_local);
+                    return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        var p_temp = p_raw.ToArray();
-                        string[] p_local = p_temp!;
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    var p_temp = p_raw.ToArray();
+                    string[] p_local = p_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 92 - 107
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,100 +54,116 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        var p_temp = p_raw.ToArray();
-                        string[] p_local = p_temp!;
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    var p_temp = p_raw.ToArray();
+                    string[] p_local = p_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local);
-                        return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
+                    var result = handler(p_local);
+                    return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        var p_temp = p_raw.ToArray();
-                        string[] p_local = p_temp!;
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    var p_temp = p_raw.ToArray();
+                    string[] p_local = p_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 266 - 283
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt

@@ -8,77 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService?, global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -93,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -115,268 +54,312 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TestService arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
-                        var svc_local = httpContext.RequestServices.GetRequiredService<Microsoft.AspNetCore.Http.Generators.Tests.TestService>();
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
+                    var svc_local = httpContext.RequestServices.GetRequiredService<Microsoft.AspNetCore.Http.Generators.Tests.TestService>();
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(svc_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = handler(svc_local);
+                    if (result is string)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
-                        var svc_local = httpContext.RequestServices.GetRequiredService<Microsoft.AspNetCore.Http.Generators.Tests.TestService>();
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(httpContext, svc_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 26)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 26));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
+                    var svc_local = httpContext.RequestServices.GetRequiredService<Microsoft.AspNetCore.Http.Generators.Tests.TestService>();
+
+                    if (wasParamCheckFailure)
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        httpContext.Response.StatusCode = 400;
                     }
-
-                    Task RequestHandler(HttpContext httpContext)
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(httpContext, svc_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: svc (Type = System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
-                        var svc_local = httpContext.RequestServices.GetRequiredService<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>>();
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(svc_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: svc (Type = System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
-                        var svc_local = httpContext.RequestServices.GetRequiredService<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>>();
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>>(httpContext, svc_local));
-                        if (result is not null)
+        [InterceptsLocation(@"TestMapActions.cs", 26, 5)]
+        internal static RouteHandlerBuilder MapGet1(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService> arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 27)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 27));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                Task RequestHandler(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService?, global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: svc (Type = System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
+                    var svc_local = httpContext.RequestServices.GetRequiredService<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>>();
+
+                    if (wasParamCheckFailure)
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService?>(0)!, ic.GetArgument<global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(svc_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: svc (Type = System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
+                    var svc_local = httpContext.RequestServices.GetRequiredService<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>>();
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>>(httpContext, svc_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService?, IsOptional = True, IsParsable = False, IsArray = False, Source = Service)
-                        var svc_local = httpContext.RequestServices.GetService<Microsoft.AspNetCore.Http.Generators.Tests.TestService?>();;
-                        // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
-                        var svcs_local = httpContext.RequestServices.GetRequiredService<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>>();
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(svc_local, svcs_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 27, 5)]
+        internal static RouteHandlerBuilder MapGet2(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TestService? arg0, global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService> arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                        return httpContext.Response.WriteAsync(result);
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService?>(0)!, ic.GetArgument<global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService?, IsOptional = True, IsParsable = False, IsArray = False, Source = Service)
+                    var svc_local = httpContext.RequestServices.GetService<Microsoft.AspNetCore.Http.Generators.Tests.TestService?>();;
+                    // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
+                    var svcs_local = httpContext.RequestServices.GetRequiredService<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>>();
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService?, IsOptional = True, IsParsable = False, IsArray = False, Source = Service)
-                        var svc_local = httpContext.RequestServices.GetService<Microsoft.AspNetCore.Http.Generators.Tests.TestService?>();;
-                        // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
-                        var svcs_local = httpContext.RequestServices.GetRequiredService<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>>();
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(svc_local, svcs_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService?, global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>>(httpContext, svc_local, svcs_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService?, IsOptional = True, IsParsable = False, IsArray = False, Source = Service)
+                    var svc_local = httpContext.RequestServices.GetService<Microsoft.AspNetCore.Http.Generators.Tests.TestService?>();;
+                    // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>, IsOptional = False, IsParsable = False, IsArray = False, Source = Service)
+                    var svcs_local = httpContext.RequestServices.GetRequiredService<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Http.Generators.Tests.TestService>>();
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService?, global::System.Collections.Generic.IEnumerable<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>>(httpContext, svc_local, svcs_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 98 - 501
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,504 +54,138 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        [InterceptsLocation(@"TestMapActions.cs", 26, 5)]
+        [InterceptsLocation(@"TestMapActions.cs", 27, 5)]
+        [InterceptsLocation(@"TestMapActions.cs", 28, 5)]
+        [InterceptsLocation(@"TestMapActions.cs", 29, 5)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: queryValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
-                        var queryValue_raw = httpContext.Request.Query["queryValue"];
-                        if (StringValues.IsNullOrEmpty(queryValue_raw))
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "queryValue", "query string");
-                        }
-                        var queryValue_temp = (string?)queryValue_raw;
-                        string queryValue_local = queryValue_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(queryValue_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
-                    }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: queryValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
-                        var queryValue_raw = httpContext.Request.Query["queryValue"];
-                        if (StringValues.IsNullOrEmpty(queryValue_raw))
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "queryValue", "query string");
-                        }
-                        var queryValue_temp = (string?)queryValue_raw;
-                        string queryValue_local = queryValue_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String>(httpContext, queryValue_local));
-                        if (result is not null)
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 26)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 26));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                Task RequestHandler(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: queryValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
+                    var queryValue_raw = httpContext.Request.Query["queryValue"];
+                    if (StringValues.IsNullOrEmpty(queryValue_raw))
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "queryValue", "query string");
                     }
+                    var queryValue_temp = (string?)queryValue_raw;
+                    string queryValue_local = queryValue_temp!;
 
-                    Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: headerValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Header)
-                        var headerValue_raw = httpContext.Request.Headers["headerValue"];
-                        if (StringValues.IsNullOrEmpty(headerValue_raw))
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "headerValue", "header");
-                        }
-                        var headerValue_temp = (string?)headerValue_raw;
-                        string headerValue_local = headerValue_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(headerValue_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = handler(queryValue_local);
+                    if (result is string)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: headerValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Header)
-                        var headerValue_raw = httpContext.Request.Headers["headerValue"];
-                        if (StringValues.IsNullOrEmpty(headerValue_raw))
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "headerValue", "header");
-                        }
-                        var headerValue_temp = (string?)headerValue_raw;
-                        string headerValue_local = headerValue_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String>(httpContext, headerValue_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
                     }
-
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 27)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 27));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    else
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: routeValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Route)
-                        if (options?.RouteParameterNames?.Contains("routeValue", StringComparer.OrdinalIgnoreCase) != true)
-                        {
-                            throw new InvalidOperationException($"'routeValue' is not a route parameter.");
-                        }
-                        var routeValue_raw = (string?)httpContext.Request.RouteValues["routeValue"];
-                        if (routeValue_raw == null)
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "routeValue", "route");
-                        }
-                        var routeValue_temp = (string?)routeValue_raw;
-                        string routeValue_local = routeValue_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(routeValue_local!);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
-                    }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: routeValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Route)
-                        if (options?.RouteParameterNames?.Contains("routeValue", StringComparer.OrdinalIgnoreCase) != true)
-                        {
-                            throw new InvalidOperationException($"'routeValue' is not a route parameter.");
-                        }
-                        var routeValue_raw = (string?)httpContext.Request.RouteValues["routeValue"];
-                        if (routeValue_raw == null)
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "routeValue", "route");
-                        }
-                        var routeValue_temp = (string?)routeValue_raw;
-                        string routeValue_local = routeValue_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String>(httpContext, routeValue_local!));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
-                    }
-
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 28)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 28));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("value", options.RouteParameterNames);
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: queryValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
+                    var queryValue_raw = httpContext.Request.Query["queryValue"];
+                    if (StringValues.IsNullOrEmpty(queryValue_raw))
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "queryValue", "query string");
                     }
+                    var queryValue_temp = (string?)queryValue_raw;
+                    string queryValue_local = queryValue_temp!;
 
-                    Task RequestHandler(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: value (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery)
-                        var value_raw = value_RouteOrQueryResolver(httpContext);
-                        if (value_raw is StringValues { Count: 0 })
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "value", "route or query string");
-                        }
-                        var value_temp = (string?)value_raw;
-                        string value_local = value_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(value_local!);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                        httpContext.Response.StatusCode = 400;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String>(httpContext, queryValue_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: value (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery)
-                        var value_raw = value_RouteOrQueryResolver(httpContext);
-                        if (value_raw is StringValues { Count: 0 })
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "value", "route or query string");
-                        }
-                        var value_temp = (string?)value_raw;
-                        string value_local = value_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String>(httpContext, value_local!));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 29)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 29));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("value", options.RouteParameterNames);
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
-                    {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: value (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery)
-                        var value_raw = value_RouteOrQueryResolver(httpContext);
-                        if (value_raw is StringValues { Count: 0 })
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "value", "route or query string");
-                        }
-                        var value_temp = (string?)value_raw;
-                        string value_local = value_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(value_local!);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
-                    }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: value (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery)
-                        var value_raw = value_RouteOrQueryResolver(httpContext);
-                        if (value_raw is StringValues { Count: 0 })
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "value", "route or query string");
-                        }
-                        var value_temp = (string?)value_raw;
-                        string value_local = value_temp!;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String>(httpContext, value_local!));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
-                    }
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;
@@ -637,12 +240,6 @@ namespace Microsoft.AspNetCore.Http.Generated
         private static bool ShouldUseWith(this JsonTypeInfo jsonTypeInfo, [NotNullWhen(false)] Type? runtimeType)
             => runtimeType is null || jsonTypeInfo.Type == runtimeType || jsonTypeInfo.HasKnownPolymorphism();
 
-        private static Func<HttpContext, StringValues> ResolveFromRouteOrQuery(string parameterName, IEnumerable<string>? routeParameterNames)
-        {
-            return routeParameterNames?.Contains(parameterName, StringComparer.OrdinalIgnoreCase) == true
-                ? (httpContext) => new StringValues((string?)httpContext.Request.RouteValues[parameterName])
-                : (httpContext) => httpContext.Request.Query[parameterName];
-        }
 
     }
 

+ 110 - 125
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,128 +54,144 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+                var p_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("p", options.RouteParameterNames);
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-                    var p_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("p", options.RouteParameterNames);
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = RouteOrQuery)
+                    var p_raw = p_RouteOrQueryResolver(httpContext);
+                    var p_temp = p_raw.ToArray();
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
+                    for (var i = 0; i < p_temp.Length; i++)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = RouteOrQuery)
-                        var p_raw = p_RouteOrQueryResolver(httpContext);
-                        var p_temp = p_raw.ToArray();
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
-                        for (var i = 0; i < p_temp.Length; i++)
+                        var element = p_temp[i];
+                        if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
                         {
-                            var element = p_temp[i];
-                            if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
+                            if (!string.IsNullOrEmpty(element))
                             {
-                                if (!string.IsNullOrEmpty(element))
-                                {
-                                    logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
-                                    wasParamCheckFailure = true;
-                                }
+                                logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
+                                wasParamCheckFailure = true;
                             }
-                            p_local[i] = parsed_element!;
                         }
+                        p_local[i] = parsed_element!;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local!);
-                        return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
+                    var result = handler(p_local!);
+                    return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = RouteOrQuery)
+                    var p_raw = p_RouteOrQueryResolver(httpContext);
+                    var p_temp = p_raw.ToArray();
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
+                    for (var i = 0; i < p_temp.Length; i++)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = RouteOrQuery)
-                        var p_raw = p_RouteOrQueryResolver(httpContext);
-                        var p_temp = p_raw.ToArray();
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length];
-                        for (var i = 0; i < p_temp.Length; i++)
+                        var element = p_temp[i];
+                        if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
                         {
-                            var element = p_temp[i];
-                            if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo>(element!, CultureInfo.InvariantCulture, out var parsed_element))
+                            if (!string.IsNullOrEmpty(element))
                             {
-                                if (!string.IsNullOrEmpty(element))
-                                {
-                                    logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
-                                    wasParamCheckFailure = true;
-                                }
+                                logOrThrowExceptionHelper.ParameterBindingFailed("ParsableTodo[]", "p", element);
+                                wasParamCheckFailure = true;
                             }
-                            p_local[i] = parsed_element!;
                         }
+                        p_local[i] = parsed_element!;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(httpContext, p_local!));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[]>(httpContext, p_local!));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 123 - 138
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String?[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String?[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String?[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String?[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String?[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String?[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 123 - 138
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String?[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String?[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String?[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String?[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String?[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String?[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 123 - 138
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String?[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String?[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String?[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String?[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String?[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String?[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 123 - 138
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 132 - 147
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo, global::Microsoft.AspNetCore.Http.Generators.Tests.TestService, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                PostVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,145 +54,161 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapPost0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)),
+                    (false, typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.TestService)),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)),
-                        (false, typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.TestService)),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.Todo arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.TestService arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
+                var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(logOrThrowExceptionHelper, "Todo", "todo", jsonOptions, serviceProviderIsService);
+                var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(logOrThrowExceptionHelper, "TestService", "svc", jsonOptions, serviceProviderIsService);
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo, global::Microsoft.AspNetCore.Http.Generators.Tests.TestService, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
-                    var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(logOrThrowExceptionHelper, "Todo", "todo", jsonOptions, serviceProviderIsService);
-                    var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(logOrThrowExceptionHelper, "TestService", "svc", jsonOptions, serviceProviderIsService);
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var todo_resolveJsonBodyOrServiceResult = await todo_JsonBodyOrServiceResolver(httpContext, false);
+                    var todo_local = todo_resolveJsonBodyOrServiceResult.Item2;
+                    if (!todo_resolveJsonBodyOrServiceResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var todo_resolveJsonBodyOrServiceResult = await todo_JsonBodyOrServiceResolver(httpContext, false);
-                        var todo_local = todo_resolveJsonBodyOrServiceResult.Item2;
-                        if (!todo_resolveJsonBodyOrServiceResult.Item1)
-                        {
-                            return;
-                        }
-                        // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var svc_resolveJsonBodyOrServiceResult = await svc_JsonBodyOrServiceResolver(httpContext, false);
-                        var svc_local = svc_resolveJsonBodyOrServiceResult.Item2;
-                        if (!svc_resolveJsonBodyOrServiceResult.Item1)
-                        {
-                            return;
-                        }
+                        return;
+                    }
+                    // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var svc_resolveJsonBodyOrServiceResult = await svc_JsonBodyOrServiceResolver(httpContext, false);
+                    var svc_local = svc_resolveJsonBodyOrServiceResult.Item2;
+                    if (!svc_resolveJsonBodyOrServiceResult.Item1)
+                    {
+                        return;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(todo_local!, svc_local!);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
+                    var result = handler(todo_local!, svc_local!);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var todo_resolveJsonBodyOrServiceResult = await todo_JsonBodyOrServiceResolver(httpContext, false);
+                    var todo_local = todo_resolveJsonBodyOrServiceResult.Item2;
+                    if (!todo_resolveJsonBodyOrServiceResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var todo_resolveJsonBodyOrServiceResult = await todo_JsonBodyOrServiceResolver(httpContext, false);
-                        var todo_local = todo_resolveJsonBodyOrServiceResult.Item2;
-                        if (!todo_resolveJsonBodyOrServiceResult.Item1)
-                        {
-                            return;
-                        }
-                        // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var svc_resolveJsonBodyOrServiceResult = await svc_JsonBodyOrServiceResolver(httpContext, false);
-                        var svc_local = svc_resolveJsonBodyOrServiceResult.Item2;
-                        if (!svc_resolveJsonBodyOrServiceResult.Item1)
-                        {
-                            return;
-                        }
+                        return;
+                    }
+                    // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var svc_resolveJsonBodyOrServiceResult = await svc_JsonBodyOrServiceResolver(httpContext, false);
+                    var svc_local = svc_resolveJsonBodyOrServiceResult.Item2;
+                    if (!svc_resolveJsonBodyOrServiceResult.Item1)
+                    {
+                        return;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo, global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(httpContext, todo_local!, svc_local!));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo, global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(httpContext, todo_local!, svc_local!));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                PostVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 95 - 110
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpRequest, global::Microsoft.AspNetCore.Http.HttpResponse, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,103 +54,119 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0, global::Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpRequest, global::Microsoft.AspNetCore.Http.HttpResponse, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpRequest>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpResponse>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpRequest>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpResponse>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var req_local = httpContext.Request;
-                        var res_local = httpContext.Response;
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var req_local = httpContext.Request;
+                    var res_local = httpContext.Response;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(req_local, res_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = handler(req_local, res_local);
+                    if (result is string)
                     {
-                        var wasParamCheckFailure = false;
-                        var req_local = httpContext.Request;
-                        var res_local = httpContext.Response;
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpRequest, global::Microsoft.AspNetCore.Http.HttpResponse>(httpContext, req_local, res_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var req_local = httpContext.Request;
+                    var res_local = httpContext.Response;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpRequest, global::Microsoft.AspNetCore.Http.HttpResponse>(httpContext, req_local, res_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 126 - 141
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String, global::System.String, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,136 +54,152 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String arg0, global::System.String arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String, global::System.String, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!, ic.GetArgument<global::System.String>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!, ic.GetArgument<global::System.String>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p1 (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
+                    var p1_raw = httpContext.Request.Query["p1"];
+                    if (StringValues.IsNullOrEmpty(p1_raw))
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p1 (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
-                        var p1_raw = httpContext.Request.Query["p1"];
-                        if (StringValues.IsNullOrEmpty(p1_raw))
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "p1", "query string");
-                        }
-                        var p1_temp = (string?)p1_raw;
-                        string p1_local = p1_temp!;
-                        // Endpoint Parameter: p2 (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
-                        var p2_raw = httpContext.Request.Query["p2"];
-                        if (StringValues.IsNullOrEmpty(p2_raw))
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "p2", "query string");
-                        }
-                        var p2_temp = (string?)p2_raw;
-                        string p2_local = p2_temp!;
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "p1", "query string");
+                    }
+                    var p1_temp = (string?)p1_raw;
+                    string p1_local = p1_temp!;
+                    // Endpoint Parameter: p2 (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
+                    var p2_raw = httpContext.Request.Query["p2"];
+                    if (StringValues.IsNullOrEmpty(p2_raw))
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "p2", "query string");
+                    }
+                    var p2_temp = (string?)p2_raw;
+                    string p2_local = p2_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p1_local, p2_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(p1_local, p2_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p1 (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
+                    var p1_raw = httpContext.Request.Query["p1"];
+                    if (StringValues.IsNullOrEmpty(p1_raw))
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p1 (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
-                        var p1_raw = httpContext.Request.Query["p1"];
-                        if (StringValues.IsNullOrEmpty(p1_raw))
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "p1", "query string");
-                        }
-                        var p1_temp = (string?)p1_raw;
-                        string p1_local = p1_temp!;
-                        // Endpoint Parameter: p2 (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
-                        var p2_raw = httpContext.Request.Query["p2"];
-                        if (StringValues.IsNullOrEmpty(p2_raw))
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "p2", "query string");
-                        }
-                        var p2_temp = (string?)p2_raw;
-                        string p2_local = p2_temp!;
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "p1", "query string");
+                    }
+                    var p1_temp = (string?)p1_raw;
+                    string p1_local = p1_temp!;
+                    // Endpoint Parameter: p2 (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query)
+                    var p2_raw = httpContext.Request.Query["p2"];
+                    if (StringValues.IsNullOrEmpty(p2_raw))
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "p2", "query string");
+                    }
+                    var p2_temp = (string?)p2_raw;
+                    string p2_local = p2_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String, global::System.String>(httpContext, p1_local, p2_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String, global::System.String>(httpContext, p1_local, p2_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 89 - 104
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,97 +54,113 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String () => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler());
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler());
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler();
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler();
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 89 - 104
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,97 +54,113 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String () => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler());
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler());
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler();
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler();
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 82 - 97
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,90 +54,106 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::Microsoft.AspNetCore.Http.Generators.Tests.Todo () => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler());
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler());
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler();
-                        return GeneratedRouteBuilderExtensionsCore.WriteJsonResponseAsync(httpContext.Response, result, responseJsonTypeInfo);
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
+                    var result = handler();
+                    return GeneratedRouteBuilderExtensionsCore.WriteJsonResponseAsync(httpContext.Response, result, responseJsonTypeInfo);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 81 - 96
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt

@@ -8,48 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpResults.ValidationProblem> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,89 +54,105 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.HttpResults.ValidationProblem>(methodInfo, options.EndpointBuilder);
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.HttpResults.ValidationProblem>(methodInfo, options.EndpointBuilder);
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::Microsoft.AspNetCore.Http.HttpResults.ValidationProblem () => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpResults.ValidationProblem>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler());
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler());
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler();
-                        return GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext);
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
+                    var result = handler();
+                    return GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 79 - 94
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Action handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,89 +54,105 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, void () => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Action)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            handler();
                             return ValueTask.FromResult<object?>(Results.Empty);
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
                         }
                         handler();
+                        return ValueTask.FromResult<object?>(Results.Empty);
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                         return Task.CompletedTask;
                     }
+                    handler();
+                    return Task.CompletedTask;
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 118 - 133
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,134 +54,150 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, IsOptional = False, IsParsable = True, IsArray = False, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    if (StringValues.IsNullOrEmpty(p_raw))
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("TryParseTodo", "p", "query string");
+                    }
+                    var p_temp = (string?)p_raw;
+                    if (!global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo.TryParse(p_temp!, out var p_parsed_temp))
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, IsOptional = False, IsParsable = True, IsArray = False, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        if (StringValues.IsNullOrEmpty(p_raw))
+                        if (!string.IsNullOrEmpty(p_temp))
                         {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("TryParseTodo", "p", p_temp);
                             wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("TryParseTodo", "p", "query string");
                         }
-                        var p_temp = (string?)p_raw;
-                        if (!global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo.TryParse(p_temp!, out var p_parsed_temp))
-                        {
-                            if (!string.IsNullOrEmpty(p_temp))
-                            {
-                                logOrThrowExceptionHelper.ParameterBindingFailed("TryParseTodo", "p", p_temp);
-                                wasParamCheckFailure = true;
-                            }
-                        }
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo p_local = p_parsed_temp!;
+                    }
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo p_local = p_parsed_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(p_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, IsOptional = False, IsParsable = True, IsArray = False, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    if (StringValues.IsNullOrEmpty(p_raw))
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, IsOptional = False, IsParsable = True, IsArray = False, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        if (StringValues.IsNullOrEmpty(p_raw))
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("TryParseTodo", "p", "query string");
+                    }
+                    var p_temp = (string?)p_raw;
+                    if (!global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo.TryParse(p_temp!, out var p_parsed_temp))
+                    {
+                        if (!string.IsNullOrEmpty(p_temp))
                         {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("TryParseTodo", "p", p_temp);
                             wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("TryParseTodo", "p", "query string");
-                        }
-                        var p_temp = (string?)p_raw;
-                        if (!global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo.TryParse(p_temp!, out var p_parsed_temp))
-                        {
-                            if (!string.IsNullOrEmpty(p_temp))
-                            {
-                                logOrThrowExceptionHelper.ParameterBindingFailed("TryParseTodo", "p", p_temp);
-                                wasParamCheckFailure = true;
-                            }
                         }
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo p_local = p_parsed_temp!;
+                    }
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo p_local = p_parsed_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo>(httpContext, p_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 118 - 133
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,134 +54,150 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus, IsOptional = False, IsParsable = True, IsArray = False, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    if (StringValues.IsNullOrEmpty(p_raw))
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("TodoStatus", "p", "query string");
+                    }
+                    var p_temp = (string?)p_raw;
+                    if (!Enum.TryParse<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus>(p_temp!, out var p_parsed_temp))
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus, IsOptional = False, IsParsable = True, IsArray = False, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        if (StringValues.IsNullOrEmpty(p_raw))
+                        if (!string.IsNullOrEmpty(p_temp))
                         {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("TodoStatus", "p", p_temp);
                             wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("TodoStatus", "p", "query string");
                         }
-                        var p_temp = (string?)p_raw;
-                        if (!Enum.TryParse<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus>(p_temp!, out var p_parsed_temp))
-                        {
-                            if (!string.IsNullOrEmpty(p_temp))
-                            {
-                                logOrThrowExceptionHelper.ParameterBindingFailed("TodoStatus", "p", p_temp);
-                                wasParamCheckFailure = true;
-                            }
-                        }
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus p_local = p_parsed_temp!;
+                    }
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus p_local = p_parsed_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(p_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus, IsOptional = False, IsParsable = True, IsArray = False, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    if (StringValues.IsNullOrEmpty(p_raw))
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus, IsOptional = False, IsParsable = True, IsArray = False, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        if (StringValues.IsNullOrEmpty(p_raw))
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("TodoStatus", "p", "query string");
+                    }
+                    var p_temp = (string?)p_raw;
+                    if (!Enum.TryParse<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus>(p_temp!, out var p_parsed_temp))
+                    {
+                        if (!string.IsNullOrEmpty(p_temp))
                         {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("TodoStatus", "p", p_temp);
                             wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("TodoStatus", "p", "query string");
-                        }
-                        var p_temp = (string?)p_raw;
-                        if (!Enum.TryParse<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus>(p_temp!, out var p_parsed_temp))
-                        {
-                            if (!string.IsNullOrEmpty(p_temp))
-                            {
-                                logOrThrowExceptionHelper.ParameterBindingFailed("TodoStatus", "p", p_temp);
-                                wasParamCheckFailure = true;
-                            }
                         }
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus p_local = p_parsed_temp!;
+                    }
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus p_local = p_parsed_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus>(httpContext, p_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 100 - 115
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String?, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,108 +54,124 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String? arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String?, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String?>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?, IsOptional = True, IsParsable = False, IsArray = False, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        var p_temp = p_raw.Count > 0 ? (string?)p_raw : null;
-                        string p_local = p_temp!;
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?, IsOptional = True, IsParsable = False, IsArray = False, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    var p_temp = p_raw.Count > 0 ? (string?)p_raw : null;
+                    string p_local = p_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(p_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = handler(p_local);
+                    if (result is string)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string?, IsOptional = True, IsParsable = False, IsArray = False, Source = Query)
-                        var p_raw = httpContext.Request.Query["p"];
-                        var p_temp = p_raw.Count > 0 ? (string?)p_raw : null;
-                        string p_local = p_temp!;
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?>(httpContext, p_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string?, IsOptional = True, IsParsable = False, IsArray = False, Source = Query)
+                    var p_raw = httpContext.Request.Query["p"];
+                    var p_temp = p_raw.Count > 0 ? (string?)p_raw : null;
+                    string p_local = p_temp!;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String?>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 110 - 125
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                PostVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,124 +54,140 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapPost0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter)),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter)),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    var parameterInfos = methodInfo.GetParameters();
-                    var x_ParameterInfo = parameterInfos[0];
-                    PopulateMetadataForParameter<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(x_ParameterInfo, options.EndpointBuilder);
-                    PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(methodInfo, options.EndpointBuilder);
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                var parameterInfos = methodInfo.GetParameters();
+                var x_ParameterInfo = parameterInfos[0];
+                PopulateMetadataForParameter<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(x_ParameterInfo, options.EndpointBuilder);
+                PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(methodInfo, options.EndpointBuilder);
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
+                var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", jsonOptions, serviceProviderIsService);
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
-                    var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", jsonOptions, serviceProviderIsService);
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(0)!);
                             return ValueTask.FromResult<object?>(Results.Empty);
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                        }
+                        handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(0)!);
+                        return ValueTask.FromResult<object?>(Results.Empty);
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: x (Type = Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var x_resolveJsonBodyOrServiceResult = await x_JsonBodyOrServiceResolver(httpContext, false);
+                    var x_local = x_resolveJsonBodyOrServiceResult.Item2;
+                    if (!x_resolveJsonBodyOrServiceResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: x (Type = Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var x_resolveJsonBodyOrServiceResult = await x_JsonBodyOrServiceResolver(httpContext, false);
-                        var x_local = x_resolveJsonBodyOrServiceResult.Item2;
-                        if (!x_resolveJsonBodyOrServiceResult.Item1)
-                        {
-                            return;
-                        }
+                        return;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        handler(x_local!);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
+                    handler(x_local!);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: x (Type = Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var x_resolveJsonBodyOrServiceResult = await x_JsonBodyOrServiceResolver(httpContext, false);
+                    var x_local = x_resolveJsonBodyOrServiceResult.Item2;
+                    if (!x_resolveJsonBodyOrServiceResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: x (Type = Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var x_resolveJsonBodyOrServiceResult = await x_JsonBodyOrServiceResolver(httpContext, false);
-                        var x_local = x_resolveJsonBodyOrServiceResult.Item2;
-                        if (!x_resolveJsonBodyOrServiceResult.Item1)
-                        {
-                            return;
-                        }
+                        return;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(httpContext, x_local!));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(httpContext, x_local!));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                PostVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 131 - 145
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt

@@ -8,47 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapMethods(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Collections.Generic.IEnumerable<string> httpMethods,
-            global::System.Func<global::System.String[], global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                httpMethods,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -62,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -84,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
-
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapMethods0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            IEnumerable<string> httpMethods,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String[], global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                httpMethods,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 131 - 145
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt

@@ -8,47 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapMethods(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Collections.Generic.IEnumerable<string> httpMethods,
-            global::System.Func<global::System.String[], global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                httpMethods,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -62,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -84,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
-
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapMethods0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            IEnumerable<string> httpMethods,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String[], global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                httpMethods,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 131 - 145
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt

@@ -8,47 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapMethods(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Collections.Generic.IEnumerable<string> httpMethods,
-            global::System.Func<global::System.String[], global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                httpMethods,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -62,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -84,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
-
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapMethods0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            IEnumerable<string> httpMethods,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String[], global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                httpMethods,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 131 - 145
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt

@@ -8,47 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapMethods(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Collections.Generic.IEnumerable<string> httpMethods,
-            global::System.Func<global::System.String[], global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                httpMethods,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -62,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -84,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
-
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapMethods0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            IEnumerable<string> httpMethods,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String[], global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                httpMethods,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 130 - 145
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String[], global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                PostVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapPost0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String[], global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                PostVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 123 - 138
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String[], global::System.Int32> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                PostVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapPost0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
+                var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
+                    (false, typeof(global::System.String[])),
+                };
+                foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var serviceProviderIsService = serviceProvider.GetRequiredService<IServiceProviderIsService>();
-                    var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {
-                        (false, typeof(global::System.String[])),
-                    };
-                    foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)
+                    if (!serviceProviderIsService.IsService(type))
                     {
-                        if (!serviceProviderIsService.IsService(type))
-                        {
-                            options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
-                            break;
-                        }
+                        options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));
+                        break;
                     }
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                }
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String[], global::System.Int32>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var responseJsonTypeInfo =  (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
-
-                    async Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String[]>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        if (wasParamCheckFailure)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            httpContext.Response.StatusCode = 400;
                             return;
                         }
-                        var result = handler(p_local);
-                        await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
                     }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
-                        global::System.String[] p_local = null!;
-                        if (options.DisableInferBodyFromParameters)
-                        {
-                            var p_raw = httpContext.Request.Query["p"];
-                            p_local = p_raw!;
-                        }
-                        else
-                        {
-                            var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
-                            var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
-                            p_local = p_resolveBodyResult.Item2!;
-                            if (!p_resolveBodyResult.Item1)
-                            {
-                                return;
-                            }
-                        }
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = handler(p_local);
+                    await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
-                        if (result is not null)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery)
+                    global::System.String[] p_local = null!;
+                    if (options.DisableInferBodyFromParameters)
+                    {
+                        var p_raw = httpContext.Request.Query["p"];
+                        p_local = p_raw!;
+                    }
+                    else
+                    {
+                        var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
+                        var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
+                        p_local = p_resolveBodyResult.Item2!;
+                        if (!p_resolveBodyResult.Item1)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return;
                         }
                     }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String[]>(httpContext, p_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                PostVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 236 - 325
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt

@@ -8,78 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.Threading.Tasks.Task<global::System.String>> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::System.Threading.Tasks.ValueTask<global::System.String>> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -93,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -115,318 +54,290 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        [InterceptsLocation(@"TestMapActions.cs", 26, 5)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String () => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler());
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler());
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler();
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = handler();
+                    if (result is string)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 26)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 26));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler());
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        httpContext.Response.StatusCode = 400;
                     }
-
-                    Task RequestHandler(HttpContext httpContext)
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler();
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+        [InterceptsLocation(@"TestMapActions.cs", 27, 5)]
+        internal static RouteHandlerBuilder MapGet1(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Threading.Tasks.Task<global::System.String> () => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic =>
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            httpContext.Response.StatusCode = 400;
+                            return (object?)Results.Empty;
                         }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
-                    }
+                        var result = await handler();
+                        return (object?)result;
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 27)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 27));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandler(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.Threading.Tasks.Task<global::System.String>>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return (object?)Results.Empty;
-                            }
-                            var result = await handler();
-                            return (object?)result;
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
-
-                    async Task RequestHandler(HttpContext httpContext)
+                    var result = await handler();
+                    if (result is string)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = await handler();
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    else
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 28)] = (
-                (methodInfo, options) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 28));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::System.Threading.Tasks.ValueTask<global::System.String>>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return (object?)Results.Empty;
-                            }
-                            var result = await handler();
-                            return (object?)result;
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 28, 5)]
+        internal static RouteHandlerBuilder MapGet2(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.Threading.Tasks.ValueTask<global::System.String> () => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic =>
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            httpContext.Response.StatusCode = 400;
-                            return;
+                            return (object?)Results.Empty;
                         }
                         var result = await handler();
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                        return (object?)result;
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
+                    }
+                    var result = await handler();
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 255 - 272
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt

@@ -8,77 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpRequest, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpResponse, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.HttpRequest, global::Microsoft.AspNetCore.Http.HttpResponse, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -93,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -115,257 +54,301 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 25)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpRequest, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpRequest>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpRequest>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var req_local = httpContext.Request;
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var req_local = httpContext.Request;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(req_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
                     }
-
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    var result = handler(req_local);
+                    if (result is string)
                     {
-                        var wasParamCheckFailure = false;
-                        var req_local = httpContext.Request;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpRequest>(httpContext, req_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 26)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 26));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                async Task RequestHandlerFiltered(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpResponse, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    var req_local = httpContext.Request;
+
+                    if (wasParamCheckFailure)
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpResponse>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        httpContext.Response.StatusCode = 400;
                     }
-
-                    Task RequestHandler(HttpContext httpContext)
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpRequest>(httpContext, req_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var res_local = httpContext.Response;
-
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(res_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        return httpContext.Response.WriteAsync(result);
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        var res_local = httpContext.Response;
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpResponse>(httpContext, res_local));
-                        if (result is not null)
+        [InterceptsLocation(@"TestMapActions.cs", 26, 5)]
+        internal static RouteHandlerBuilder MapGet1(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpResponse arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpResponse>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 27)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 27));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                Task RequestHandler(HttpContext httpContext)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.HttpRequest, global::Microsoft.AspNetCore.Http.HttpResponse, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var wasParamCheckFailure = false;
+                    var res_local = httpContext.Response;
+
+                    if (wasParamCheckFailure)
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpRequest>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpResponse>(1)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(res_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
                     }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var res_local = httpContext.Response;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpResponse>(httpContext, res_local));
+                    if (result is not null)
                     {
-                        var wasParamCheckFailure = false;
-                        var req_local = httpContext.Request;
-                        var res_local = httpContext.Response;
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        var result = handler(req_local, res_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 27, 5)]
+        internal static RouteHandlerBuilder MapGet2(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0, global::Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
-                        return httpContext.Response.WriteAsync(result);
-                    }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpRequest>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpResponse>(1)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var req_local = httpContext.Request;
+                    var res_local = httpContext.Response;
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                    if (wasParamCheckFailure)
                     {
-                        var wasParamCheckFailure = false;
-                        var req_local = httpContext.Request;
-                        var res_local = httpContext.Response;
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(req_local, res_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    return httpContext.Response.WriteAsync(result);
+                }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpRequest, global::Microsoft.AspNetCore.Http.HttpResponse>(httpContext, req_local, res_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var req_local = httpContext.Request;
+                    var res_local = httpContext.Response;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpRequest, global::Microsoft.AspNetCore.Http.HttpResponse>(httpContext, req_local, res_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 175 - 190
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt

@@ -8,47 +8,15 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
-        {
-            Path = path;
-            Line = line;
-        }
-    }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Action<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.IFormFile, global::Microsoft.AspNetCore.Http.IFormFileCollection, global::Microsoft.AspNetCore.Http.IFormCollection, global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                PostVerb,
-                filePath,
-                lineNumber);
         }
-
     }
 }
 
@@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -85,192 +54,208 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 29, 5)]
+        internal static RouteHandlerBuilder MapPost0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 29)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 29));
-                    options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.FormFileContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.FormFileContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.IFormFile arg1, global::Microsoft.AspNetCore.Http.IFormFileCollection arg2, global::Microsoft.AspNetCore.Http.IFormCollection arg3, global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord arg4) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Action<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.IFormFile, global::Microsoft.AspNetCore.Http.IFormFileCollection, global::Microsoft.AspNetCore.Http.IFormCollection, global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.IFormFile>(1)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.IFormFileCollection>(2)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.IFormCollection>(3)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord>(4)!);
                             return ValueTask.FromResult<object?>(Results.Empty);
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                        }
+                        handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.HttpContext>(0)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.IFormFile>(1)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.IFormFileCollection>(2)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.IFormCollection>(3)!, ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord>(4)!);
+                        return ValueTask.FromResult<object?>(Results.Empty);
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    // Endpoint Parameter: file (Type = Microsoft.AspNetCore.Http.IFormFile, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
+                    var file_resolveFormResult = await GeneratedRouteBuilderExtensionsCore.TryResolveFormAsync(httpContext, logOrThrowExceptionHelper, "IFormFile", "file");
+                    if (!file_resolveFormResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        // Endpoint Parameter: file (Type = Microsoft.AspNetCore.Http.IFormFile, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
-                        var file_resolveFormResult = await GeneratedRouteBuilderExtensionsCore.TryResolveFormAsync(httpContext, logOrThrowExceptionHelper, "IFormFile", "file");
-                        if (!file_resolveFormResult.Item1)
-                        {
-                            return;
-                        }
-                        var file_raw = httpContext.Request.Form.Files["file"];
-                        if (file_raw == null)
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormFile", "file", "form");
-                        }
-                        var file_temp = file_raw;
-                        global::Microsoft.AspNetCore.Http.IFormFile file_local = file_temp!;
-                        // Endpoint Parameter: fileCollection (Type = Microsoft.AspNetCore.Http.IFormFileCollection, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
-                        var fileCollection_raw = httpContext.Request.Form.Files;
-                        if (fileCollection_raw == null)
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormFileCollection", "fileCollection", "form");
-                        }
-                        var fileCollection_temp = fileCollection_raw;
-                        global::Microsoft.AspNetCore.Http.IFormFileCollection fileCollection_local = fileCollection_temp!;
-                        // Endpoint Parameter: collection (Type = Microsoft.AspNetCore.Http.IFormCollection, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
-                        var collection_raw = httpContext.Request.Form;
-                        if (collection_raw == null)
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormCollection", "collection", "form");
-                        }
-                        var collection_temp = collection_raw;
-                        global::Microsoft.AspNetCore.Http.IFormCollection collection_local = collection_temp!;
-                        // Endpoint Parameter: tryParseRecord (Type = Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord, IsOptional = False, IsParsable = True, IsArray = False, Source = FormBody)
-                        var tryParseRecord_raw = (string?)httpContext.Request.Form["tryParseRecord"];
-                        if (tryParseRecord_raw == null)
+                        return;
+                    }
+                    var file_raw = httpContext.Request.Form.Files["file"];
+                    if (file_raw == null)
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormFile", "file", "form");
+                    }
+                    var file_temp = file_raw;
+                    global::Microsoft.AspNetCore.Http.IFormFile file_local = file_temp!;
+                    // Endpoint Parameter: fileCollection (Type = Microsoft.AspNetCore.Http.IFormFileCollection, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
+                    var fileCollection_raw = httpContext.Request.Form.Files;
+                    if (fileCollection_raw == null)
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormFileCollection", "fileCollection", "form");
+                    }
+                    var fileCollection_temp = fileCollection_raw;
+                    global::Microsoft.AspNetCore.Http.IFormFileCollection fileCollection_local = fileCollection_temp!;
+                    // Endpoint Parameter: collection (Type = Microsoft.AspNetCore.Http.IFormCollection, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
+                    var collection_raw = httpContext.Request.Form;
+                    if (collection_raw == null)
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormCollection", "collection", "form");
+                    }
+                    var collection_temp = collection_raw;
+                    global::Microsoft.AspNetCore.Http.IFormCollection collection_local = collection_temp!;
+                    // Endpoint Parameter: tryParseRecord (Type = Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord, IsOptional = False, IsParsable = True, IsArray = False, Source = FormBody)
+                    var tryParseRecord_raw = (string?)httpContext.Request.Form["tryParseRecord"];
+                    if (tryParseRecord_raw == null)
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyTryParseRecord", "tryParseRecord", "form");
+                    }
+                    var tryParseRecord_temp = tryParseRecord_raw;
+                    if (!global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord.TryParse(tryParseRecord_temp!, out var tryParseRecord_parsed_temp))
+                    {
+                        if (!string.IsNullOrEmpty(tryParseRecord_temp))
                         {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("MyTryParseRecord", "tryParseRecord", tryParseRecord_temp);
                             wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyTryParseRecord", "tryParseRecord", "form");
                         }
-                        var tryParseRecord_temp = tryParseRecord_raw;
-                        if (!global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord.TryParse(tryParseRecord_temp!, out var tryParseRecord_parsed_temp))
-                        {
-                            if (!string.IsNullOrEmpty(tryParseRecord_temp))
-                            {
-                                logOrThrowExceptionHelper.ParameterBindingFailed("MyTryParseRecord", "tryParseRecord", tryParseRecord_temp);
-                                wasParamCheckFailure = true;
-                            }
-                        }
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord tryParseRecord_local = tryParseRecord_parsed_temp!;
+                    }
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord tryParseRecord_local = tryParseRecord_parsed_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        handler(httpContext_local, file_local!, fileCollection_local!, collection_local!, tryParseRecord_local!);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
+                    handler(httpContext_local, file_local!, fileCollection_local!, collection_local!, tryParseRecord_local!);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    var httpContext_local = httpContext;
+                    // Endpoint Parameter: file (Type = Microsoft.AspNetCore.Http.IFormFile, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
+                    var file_resolveFormResult = await GeneratedRouteBuilderExtensionsCore.TryResolveFormAsync(httpContext, logOrThrowExceptionHelper, "IFormFile", "file");
+                    if (!file_resolveFormResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        var httpContext_local = httpContext;
-                        // Endpoint Parameter: file (Type = Microsoft.AspNetCore.Http.IFormFile, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
-                        var file_resolveFormResult = await GeneratedRouteBuilderExtensionsCore.TryResolveFormAsync(httpContext, logOrThrowExceptionHelper, "IFormFile", "file");
-                        if (!file_resolveFormResult.Item1)
-                        {
-                            return;
-                        }
-                        var file_raw = httpContext.Request.Form.Files["file"];
-                        if (file_raw == null)
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormFile", "file", "form");
-                        }
-                        var file_temp = file_raw;
-                        global::Microsoft.AspNetCore.Http.IFormFile file_local = file_temp!;
-                        // Endpoint Parameter: fileCollection (Type = Microsoft.AspNetCore.Http.IFormFileCollection, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
-                        var fileCollection_raw = httpContext.Request.Form.Files;
-                        if (fileCollection_raw == null)
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormFileCollection", "fileCollection", "form");
-                        }
-                        var fileCollection_temp = fileCollection_raw;
-                        global::Microsoft.AspNetCore.Http.IFormFileCollection fileCollection_local = fileCollection_temp!;
-                        // Endpoint Parameter: collection (Type = Microsoft.AspNetCore.Http.IFormCollection, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
-                        var collection_raw = httpContext.Request.Form;
-                        if (collection_raw == null)
-                        {
-                            wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormCollection", "collection", "form");
-                        }
-                        var collection_temp = collection_raw;
-                        global::Microsoft.AspNetCore.Http.IFormCollection collection_local = collection_temp!;
-                        // Endpoint Parameter: tryParseRecord (Type = Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord, IsOptional = False, IsParsable = True, IsArray = False, Source = FormBody)
-                        var tryParseRecord_raw = (string?)httpContext.Request.Form["tryParseRecord"];
-                        if (tryParseRecord_raw == null)
+                        return;
+                    }
+                    var file_raw = httpContext.Request.Form.Files["file"];
+                    if (file_raw == null)
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormFile", "file", "form");
+                    }
+                    var file_temp = file_raw;
+                    global::Microsoft.AspNetCore.Http.IFormFile file_local = file_temp!;
+                    // Endpoint Parameter: fileCollection (Type = Microsoft.AspNetCore.Http.IFormFileCollection, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
+                    var fileCollection_raw = httpContext.Request.Form.Files;
+                    if (fileCollection_raw == null)
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormFileCollection", "fileCollection", "form");
+                    }
+                    var fileCollection_temp = fileCollection_raw;
+                    global::Microsoft.AspNetCore.Http.IFormFileCollection fileCollection_local = fileCollection_temp!;
+                    // Endpoint Parameter: collection (Type = Microsoft.AspNetCore.Http.IFormCollection, IsOptional = False, IsParsable = False, IsArray = False, Source = FormBody)
+                    var collection_raw = httpContext.Request.Form;
+                    if (collection_raw == null)
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("IFormCollection", "collection", "form");
+                    }
+                    var collection_temp = collection_raw;
+                    global::Microsoft.AspNetCore.Http.IFormCollection collection_local = collection_temp!;
+                    // Endpoint Parameter: tryParseRecord (Type = Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord, IsOptional = False, IsParsable = True, IsArray = False, Source = FormBody)
+                    var tryParseRecord_raw = (string?)httpContext.Request.Form["tryParseRecord"];
+                    if (tryParseRecord_raw == null)
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("MyTryParseRecord", "tryParseRecord", "form");
+                    }
+                    var tryParseRecord_temp = tryParseRecord_raw;
+                    if (!global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord.TryParse(tryParseRecord_temp!, out var tryParseRecord_parsed_temp))
+                    {
+                        if (!string.IsNullOrEmpty(tryParseRecord_temp))
                         {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("MyTryParseRecord", "tryParseRecord", tryParseRecord_temp);
                             wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("MyTryParseRecord", "tryParseRecord", "form");
-                        }
-                        var tryParseRecord_temp = tryParseRecord_raw;
-                        if (!global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord.TryParse(tryParseRecord_temp!, out var tryParseRecord_parsed_temp))
-                        {
-                            if (!string.IsNullOrEmpty(tryParseRecord_temp))
-                            {
-                                logOrThrowExceptionHelper.ParameterBindingFailed("MyTryParseRecord", "tryParseRecord", tryParseRecord_temp);
-                                wasParamCheckFailure = true;
-                            }
                         }
-                        global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord tryParseRecord_local = tryParseRecord_parsed_temp!;
+                    }
+                    global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord tryParseRecord_local = tryParseRecord_parsed_temp!;
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.IFormFile, global::Microsoft.AspNetCore.Http.IFormFileCollection, global::Microsoft.AspNetCore.Http.IFormCollection, global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord>(httpContext, httpContext_local, file_local!, fileCollection_local!, collection_local!, tryParseRecord_local!));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.HttpContext, global::Microsoft.AspNetCore.Http.IFormFile, global::Microsoft.AspNetCore.Http.IFormFileCollection, global::Microsoft.AspNetCore.Http.IFormCollection, global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord>(httpContext, httpContext_local, file_local!, fileCollection_local!, collection_local!, tryParseRecord_local!));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                PostVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 529 - 0
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt

@@ -0,0 +1,529 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+#nullable enable
+
+namespace System.Runtime.CompilerServices
+{
+    %GENERATEDCODEATTRIBUTE%
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
+    {
+        public InterceptsLocationAttribute(string filePath, int line, int column)
+        {
+        }
+    }
+}
+
+namespace Microsoft.AspNetCore.Http.Generated
+{
+    using System;
+    using System.Collections;
+    using System.Collections.Generic;
+    using System.Collections.ObjectModel;
+    using System.Diagnostics;
+    using System.Diagnostics.CodeAnalysis;
+    using System.Globalization;
+    using System.Linq;
+    using System.Reflection;
+    using System.Runtime.CompilerServices;
+    using System.Text.Json;
+    using System.Text.Json.Serialization.Metadata;
+    using System.Threading.Tasks;
+    using System.IO;
+    using Microsoft.AspNetCore.Routing;
+    using Microsoft.AspNetCore.Routing.Patterns;
+    using Microsoft.AspNetCore.Builder;
+    using Microsoft.AspNetCore.Http;
+    using Microsoft.AspNetCore.Http.Json;
+    using Microsoft.AspNetCore.Http.Metadata;
+    using Microsoft.Extensions.DependencyInjection;
+    using Microsoft.Extensions.FileProviders;
+    using Microsoft.Extensions.Logging;
+    using Microsoft.Extensions.Primitives;
+    using Microsoft.Extensions.Options;
+
+    using MetadataPopulator = System.Func<System.Reflection.MethodInfo, Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions?, Microsoft.AspNetCore.Http.RequestDelegateMetadataResult>;
+    using RequestDelegateFactoryFunc = System.Func<System.Delegate, Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions, Microsoft.AspNetCore.Http.RequestDelegateMetadataResult?, Microsoft.AspNetCore.Http.RequestDelegateResult>;
+
+    %GENERATEDCODEATTRIBUTE%
+    file static class GeneratedRouteBuilderExtensionsCore
+    {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
+
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var name_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("name", options.RouteParameterNames);
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
+                        {
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: name (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery)
+                    var name_raw = name_RouteOrQueryResolver(httpContext);
+                    if (name_raw is StringValues { Count: 0 })
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "name", "route or query string");
+                    }
+                    var name_temp = (string?)name_raw;
+                    string name_local = name_temp!;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(name_local!);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    return httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: name (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery)
+                    var name_raw = name_RouteOrQueryResolver(httpContext);
+                    if (name_raw is StringValues { Count: 0 })
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "name", "route or query string");
+                    }
+                    var name_temp = (string?)name_raw;
+                    string name_local = name_temp!;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String>(httpContext, name_local!));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"OtherTestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet1(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.Int32 arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var age_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("age", options.RouteParameterNames);
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
+                        {
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.Int32>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: age (Type = int, IsOptional = False, IsParsable = True, IsArray = False, Source = RouteOrQuery)
+                    var age_raw = age_RouteOrQueryResolver(httpContext);
+                    if (age_raw is StringValues { Count: 0 })
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("int", "age", "route or query string");
+                    }
+                    var age_temp = (string?)age_raw;
+                    if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(age_temp!, CultureInfo.InvariantCulture, out var age_parsed_temp))
+                    {
+                        if (!string.IsNullOrEmpty(age_temp))
+                        {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("int", "age", age_temp);
+                            wasParamCheckFailure = true;
+                        }
+                    }
+                    int age_local = age_parsed_temp!;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(age_local!);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    return httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: age (Type = int, IsOptional = False, IsParsable = True, IsArray = False, Source = RouteOrQuery)
+                    var age_raw = age_RouteOrQueryResolver(httpContext);
+                    if (age_raw is StringValues { Count: 0 })
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("int", "age", "route or query string");
+                    }
+                    var age_temp = (string?)age_raw;
+                    if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(age_temp!, CultureInfo.InvariantCulture, out var age_parsed_temp))
+                    {
+                        if (!string.IsNullOrEmpty(age_temp))
+                        {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("int", "age", age_temp);
+                            wasParamCheckFailure = true;
+                        }
+                    }
+                    int age_local = age_parsed_temp!;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.Int32>(httpContext, age_local!));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+
+
+        internal static RouteHandlerBuilder MapCore(
+            this IEndpointRouteBuilder routes,
+            string pattern,
+            Delegate handler,
+            IEnumerable<string>? httpMethods,
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
+        {
+            return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
+        }
+
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
+        private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
+        {
+            var routeHandlerFilters =  builder.FilterFactories;
+            var context0 = new EndpointFilterFactoryContext
+            {
+                MethodInfo = mi,
+                ApplicationServices = builder.ApplicationServices,
+            };
+            var initialFilteredInvocation = filteredInvocation;
+            for (var i = routeHandlerFilters.Count - 1; i >= 0; i--)
+            {
+                var filterFactory = routeHandlerFilters[i];
+                filteredInvocation = filterFactory(context0, filteredInvocation);
+            }
+            return filteredInvocation;
+        }
+
+        private static Task ExecuteReturnAsync(object? obj, HttpContext httpContext, JsonTypeInfo<object?> jsonTypeInfo)
+        {
+            if (obj is IResult r)
+            {
+                return r.ExecuteAsync(httpContext);
+            }
+            else if (obj is string s)
+            {
+                return httpContext.Response.WriteAsync(s);
+            }
+            else
+            {
+                return WriteJsonResponseAsync(httpContext.Response, obj, jsonTypeInfo);
+            }
+        }
+
+        [UnconditionalSuppressMessage("Trimming", "IL2026:RequiresUnreferencedCode",
+            Justification = "The 'JsonSerializer.IsReflectionEnabledByDefault' feature switch, which is set to false by default for trimmed ASP.NET apps, ensures the JsonSerializer doesn't use Reflection.")]
+        [UnconditionalSuppressMessage("AOT", "IL3050:RequiresDynamicCode", Justification = "See above.")]
+        private static Task WriteJsonResponseAsync<T>(HttpResponse response, T? value, JsonTypeInfo<T?> jsonTypeInfo)
+        {
+            var runtimeType = value?.GetType();
+
+            if (jsonTypeInfo.ShouldUseWith(runtimeType))
+            {
+                return HttpResponseJsonExtensions.WriteAsJsonAsync(response, value, jsonTypeInfo, default);
+            }
+
+            return response.WriteAsJsonAsync<object?>(value, jsonTypeInfo.Options);
+        }
+
+        private static bool HasKnownPolymorphism(this JsonTypeInfo jsonTypeInfo)
+            => jsonTypeInfo.Type.IsSealed || jsonTypeInfo.Type.IsValueType || jsonTypeInfo.PolymorphismOptions is not null;
+
+        private static bool ShouldUseWith(this JsonTypeInfo jsonTypeInfo, [NotNullWhen(false)] Type? runtimeType)
+            => runtimeType is null || jsonTypeInfo.Type == runtimeType || jsonTypeInfo.HasKnownPolymorphism();
+
+        private static Func<HttpContext, StringValues> ResolveFromRouteOrQuery(string parameterName, IEnumerable<string>? routeParameterNames)
+        {
+            return routeParameterNames?.Contains(parameterName, StringComparer.OrdinalIgnoreCase) == true
+                ? (httpContext) => new StringValues((string?)httpContext.Request.RouteValues[parameterName])
+                : (httpContext) => httpContext.Request.Query[parameterName];
+        }
+        private static bool TryParseExplicit<T>(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) where T: IParsable<T>
+            => T.TryParse(s, provider, out result);
+
+    }
+
+    %GENERATEDCODEATTRIBUTE%
+    file static class GeneratedMetadataConstants
+    {
+        public static readonly string[] JsonContentType = new [] { "application/json" };
+        public static readonly string[] PlaintextContentType = new [] { "text/plain" };
+        public static readonly string[] FormFileContentType = new[] { "multipart/form-data" };
+        public static readonly string[] FormContentType = new[] { "multipart/form-data", "application/x-www-form-urlencoded" };
+    }
+
+
+    %GENERATEDCODEATTRIBUTE%
+    file sealed class LogOrThrowExceptionHelper
+    {
+        private readonly ILogger? _rdgLogger;
+        private readonly bool _shouldThrow;
+
+        public LogOrThrowExceptionHelper(IServiceProvider? serviceProvider, RequestDelegateFactoryOptions? options)
+        {
+            var loggerFactory = serviceProvider?.GetRequiredService<ILoggerFactory>();
+            _rdgLogger = loggerFactory?.CreateLogger("Microsoft.AspNetCore.Http.RequestDelegateGenerator.RequestDelegateGenerator");
+            _shouldThrow = options?.ThrowOnBadRequest ?? false;
+        }
+
+        public void RequestBodyIOException(IOException exception)
+        {
+            if (_rdgLogger != null)
+            {
+                _requestBodyIOException(_rdgLogger, exception);
+            }
+        }
+
+        private static readonly Action<ILogger, Exception?> _requestBodyIOException =
+            LoggerMessage.Define(LogLevel.Debug, new EventId(1, "RequestBodyIOException"), "Reading the request body failed with an IOException.");
+
+        public void InvalidJsonRequestBody(string parameterTypeName, string parameterName, Exception exception)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Failed to read parameter \"{0} {1}\" from the request body as JSON.", parameterTypeName, parameterName);
+                throw new BadHttpRequestException(message, exception);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _invalidJsonRequestBody(_rdgLogger, parameterTypeName, parameterName, exception);
+            }
+        }
+
+        private static readonly Action<ILogger, string, string, Exception?> _invalidJsonRequestBody =
+            LoggerMessage.Define<string, string>(LogLevel.Debug, new EventId(2, "InvalidJsonRequestBody"), "Failed to read parameter \"{ParameterType} {ParameterName}\" from the request body as JSON.");
+
+        public void ParameterBindingFailed(string parameterTypeName, string parameterName, string sourceValue)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Failed to bind parameter \"{0} {1}\" from \"{2}\".", parameterTypeName, parameterName, sourceValue);
+                throw new BadHttpRequestException(message);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _parameterBindingFailed(_rdgLogger, parameterTypeName, parameterName, sourceValue, null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, string, string, Exception?> _parameterBindingFailed =
+            LoggerMessage.Define<string, string, string>(LogLevel.Debug, new EventId(3, "ParameterBindingFailed"), "Failed to bind parameter \"{ParameterType} {ParameterName}\" from \"{SourceValue}\".");
+
+        public void RequiredParameterNotProvided(string parameterTypeName, string parameterName, string source)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Required parameter \"{0} {1}\" was not provided from {2}.", parameterTypeName, parameterName, source);
+                throw new BadHttpRequestException(message);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _requiredParameterNotProvided(_rdgLogger, parameterTypeName, parameterName, source, null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, string, string, Exception?> _requiredParameterNotProvided =
+            LoggerMessage.Define<string, string, string>(LogLevel.Debug, new EventId(4, "RequiredParameterNotProvided"), "Required parameter \"{ParameterType} {ParameterName}\" was not provided from {Source}.");
+
+        public void ImplicitBodyNotProvided(string parameterName)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Implicit body inferred for parameter \"{0}\" but no body was provided. Did you mean to use a Service instead?", parameterName);
+                throw new BadHttpRequestException(message);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _implicitBodyNotProvided(_rdgLogger, parameterName, null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, Exception?> _implicitBodyNotProvided =
+            LoggerMessage.Define<string>(LogLevel.Debug, new EventId(5, "ImplicitBodyNotProvided"), "Implicit body inferred for parameter \"{ParameterName}\" but no body was provided. Did you mean to use a Service instead?");
+
+        public void UnexpectedJsonContentType(string? contentType)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Expected a supported JSON media type but got \"{0}\".", contentType);
+                throw new BadHttpRequestException(message, StatusCodes.Status415UnsupportedMediaType);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _unexpectedJsonContentType(_rdgLogger, contentType ?? "(none)", null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, Exception?> _unexpectedJsonContentType =
+            LoggerMessage.Define<string>(LogLevel.Debug, new EventId(6, "UnexpectedContentType"), "Expected a supported JSON media type but got \"{ContentType}\".");
+
+        public void UnexpectedNonFormContentType(string? contentType)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Expected a supported form media type but got \"{0}\".", contentType);
+                throw new BadHttpRequestException(message, StatusCodes.Status415UnsupportedMediaType);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _unexpectedNonFormContentType(_rdgLogger, contentType ?? "(none)", null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, Exception?> _unexpectedNonFormContentType =
+            LoggerMessage.Define<string>(LogLevel.Debug, new EventId(7, "UnexpectedNonFormContentType"), "Expected a supported form media type but got \"{ContentType}\".");
+
+        public void InvalidFormRequestBody(string parameterTypeName, string parameterName, Exception exception)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Failed to read parameter \"{0} {1}\" from the request body as form.", parameterTypeName, parameterName);
+                throw new BadHttpRequestException(message, exception);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _invalidFormRequestBody(_rdgLogger, parameterTypeName, parameterName, exception);
+            }
+        }
+
+        private static readonly Action<ILogger, string, string, Exception?> _invalidFormRequestBody =
+            LoggerMessage.Define<string, string>(LogLevel.Debug, new EventId(8, "InvalidFormRequestBody"), "Failed to read parameter \"{ParameterType} {ParameterName}\" from the request body as form.");
+    }
+}

+ 404 - 0
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt

@@ -0,0 +1,404 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+#nullable enable
+
+namespace System.Runtime.CompilerServices
+{
+    %GENERATEDCODEATTRIBUTE%
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
+    {
+        public InterceptsLocationAttribute(string filePath, int line, int column)
+        {
+        }
+    }
+}
+
+namespace Microsoft.AspNetCore.Http.Generated
+{
+    using System;
+    using System.Collections;
+    using System.Collections.Generic;
+    using System.Collections.ObjectModel;
+    using System.Diagnostics;
+    using System.Diagnostics.CodeAnalysis;
+    using System.Globalization;
+    using System.Linq;
+    using System.Reflection;
+    using System.Runtime.CompilerServices;
+    using System.Text.Json;
+    using System.Text.Json.Serialization.Metadata;
+    using System.Threading.Tasks;
+    using System.IO;
+    using Microsoft.AspNetCore.Routing;
+    using Microsoft.AspNetCore.Routing.Patterns;
+    using Microsoft.AspNetCore.Builder;
+    using Microsoft.AspNetCore.Http;
+    using Microsoft.AspNetCore.Http.Json;
+    using Microsoft.AspNetCore.Http.Metadata;
+    using Microsoft.Extensions.DependencyInjection;
+    using Microsoft.Extensions.FileProviders;
+    using Microsoft.Extensions.Logging;
+    using Microsoft.Extensions.Primitives;
+    using Microsoft.Extensions.Options;
+
+    using MetadataPopulator = System.Func<System.Reflection.MethodInfo, Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions?, Microsoft.AspNetCore.Http.RequestDelegateMetadataResult>;
+    using RequestDelegateFactoryFunc = System.Func<System.Delegate, Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions, Microsoft.AspNetCore.Http.RequestDelegateMetadataResult?, Microsoft.AspNetCore.Http.RequestDelegateResult>;
+
+    %GENERATEDCODEATTRIBUTE%
+    file static class GeneratedRouteBuilderExtensionsCore
+    {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
+
+        [InterceptsLocation(@"TestMapActions.cs", 25, 13)]
+        [InterceptsLocation(@"TestMapActions.cs", 25, 63)]
+        [InterceptsLocation(@"OtherTestMapActions.cs", 25, 13)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::System.String arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var name_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("name", options.RouteParameterNames);
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                    {
+                        if (ic.HttpContext.Response.StatusCode == 400)
+                        {
+                            return ValueTask.FromResult<object?>(Results.Empty);
+                        }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::System.String>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
+
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: name (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery)
+                    var name_raw = name_RouteOrQueryResolver(httpContext);
+                    if (name_raw is StringValues { Count: 0 })
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "name", "route or query string");
+                    }
+                    var name_temp = (string?)name_raw;
+                    string name_local = name_temp!;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return Task.CompletedTask;
+                    }
+                    var result = handler(name_local!);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    return httpContext.Response.WriteAsync(result);
+                }
+
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: name (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery)
+                    var name_raw = name_RouteOrQueryResolver(httpContext);
+                    if (name_raw is StringValues { Count: 0 })
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "name", "route or query string");
+                    }
+                    var name_temp = (string?)name_raw;
+                    string name_local = name_temp!;
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::System.String>(httpContext, name_local!));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
+                    }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+
+
+        internal static RouteHandlerBuilder MapCore(
+            this IEndpointRouteBuilder routes,
+            string pattern,
+            Delegate handler,
+            IEnumerable<string>? httpMethods,
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
+        {
+            return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
+        }
+
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
+        private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
+        {
+            var routeHandlerFilters =  builder.FilterFactories;
+            var context0 = new EndpointFilterFactoryContext
+            {
+                MethodInfo = mi,
+                ApplicationServices = builder.ApplicationServices,
+            };
+            var initialFilteredInvocation = filteredInvocation;
+            for (var i = routeHandlerFilters.Count - 1; i >= 0; i--)
+            {
+                var filterFactory = routeHandlerFilters[i];
+                filteredInvocation = filterFactory(context0, filteredInvocation);
+            }
+            return filteredInvocation;
+        }
+
+        private static Task ExecuteReturnAsync(object? obj, HttpContext httpContext, JsonTypeInfo<object?> jsonTypeInfo)
+        {
+            if (obj is IResult r)
+            {
+                return r.ExecuteAsync(httpContext);
+            }
+            else if (obj is string s)
+            {
+                return httpContext.Response.WriteAsync(s);
+            }
+            else
+            {
+                return WriteJsonResponseAsync(httpContext.Response, obj, jsonTypeInfo);
+            }
+        }
+
+        [UnconditionalSuppressMessage("Trimming", "IL2026:RequiresUnreferencedCode",
+            Justification = "The 'JsonSerializer.IsReflectionEnabledByDefault' feature switch, which is set to false by default for trimmed ASP.NET apps, ensures the JsonSerializer doesn't use Reflection.")]
+        [UnconditionalSuppressMessage("AOT", "IL3050:RequiresDynamicCode", Justification = "See above.")]
+        private static Task WriteJsonResponseAsync<T>(HttpResponse response, T? value, JsonTypeInfo<T?> jsonTypeInfo)
+        {
+            var runtimeType = value?.GetType();
+
+            if (jsonTypeInfo.ShouldUseWith(runtimeType))
+            {
+                return HttpResponseJsonExtensions.WriteAsJsonAsync(response, value, jsonTypeInfo, default);
+            }
+
+            return response.WriteAsJsonAsync<object?>(value, jsonTypeInfo.Options);
+        }
+
+        private static bool HasKnownPolymorphism(this JsonTypeInfo jsonTypeInfo)
+            => jsonTypeInfo.Type.IsSealed || jsonTypeInfo.Type.IsValueType || jsonTypeInfo.PolymorphismOptions is not null;
+
+        private static bool ShouldUseWith(this JsonTypeInfo jsonTypeInfo, [NotNullWhen(false)] Type? runtimeType)
+            => runtimeType is null || jsonTypeInfo.Type == runtimeType || jsonTypeInfo.HasKnownPolymorphism();
+
+        private static Func<HttpContext, StringValues> ResolveFromRouteOrQuery(string parameterName, IEnumerable<string>? routeParameterNames)
+        {
+            return routeParameterNames?.Contains(parameterName, StringComparer.OrdinalIgnoreCase) == true
+                ? (httpContext) => new StringValues((string?)httpContext.Request.RouteValues[parameterName])
+                : (httpContext) => httpContext.Request.Query[parameterName];
+        }
+
+    }
+
+    %GENERATEDCODEATTRIBUTE%
+    file static class GeneratedMetadataConstants
+    {
+        public static readonly string[] JsonContentType = new [] { "application/json" };
+        public static readonly string[] PlaintextContentType = new [] { "text/plain" };
+        public static readonly string[] FormFileContentType = new[] { "multipart/form-data" };
+        public static readonly string[] FormContentType = new[] { "multipart/form-data", "application/x-www-form-urlencoded" };
+    }
+
+
+    %GENERATEDCODEATTRIBUTE%
+    file sealed class LogOrThrowExceptionHelper
+    {
+        private readonly ILogger? _rdgLogger;
+        private readonly bool _shouldThrow;
+
+        public LogOrThrowExceptionHelper(IServiceProvider? serviceProvider, RequestDelegateFactoryOptions? options)
+        {
+            var loggerFactory = serviceProvider?.GetRequiredService<ILoggerFactory>();
+            _rdgLogger = loggerFactory?.CreateLogger("Microsoft.AspNetCore.Http.RequestDelegateGenerator.RequestDelegateGenerator");
+            _shouldThrow = options?.ThrowOnBadRequest ?? false;
+        }
+
+        public void RequestBodyIOException(IOException exception)
+        {
+            if (_rdgLogger != null)
+            {
+                _requestBodyIOException(_rdgLogger, exception);
+            }
+        }
+
+        private static readonly Action<ILogger, Exception?> _requestBodyIOException =
+            LoggerMessage.Define(LogLevel.Debug, new EventId(1, "RequestBodyIOException"), "Reading the request body failed with an IOException.");
+
+        public void InvalidJsonRequestBody(string parameterTypeName, string parameterName, Exception exception)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Failed to read parameter \"{0} {1}\" from the request body as JSON.", parameterTypeName, parameterName);
+                throw new BadHttpRequestException(message, exception);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _invalidJsonRequestBody(_rdgLogger, parameterTypeName, parameterName, exception);
+            }
+        }
+
+        private static readonly Action<ILogger, string, string, Exception?> _invalidJsonRequestBody =
+            LoggerMessage.Define<string, string>(LogLevel.Debug, new EventId(2, "InvalidJsonRequestBody"), "Failed to read parameter \"{ParameterType} {ParameterName}\" from the request body as JSON.");
+
+        public void ParameterBindingFailed(string parameterTypeName, string parameterName, string sourceValue)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Failed to bind parameter \"{0} {1}\" from \"{2}\".", parameterTypeName, parameterName, sourceValue);
+                throw new BadHttpRequestException(message);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _parameterBindingFailed(_rdgLogger, parameterTypeName, parameterName, sourceValue, null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, string, string, Exception?> _parameterBindingFailed =
+            LoggerMessage.Define<string, string, string>(LogLevel.Debug, new EventId(3, "ParameterBindingFailed"), "Failed to bind parameter \"{ParameterType} {ParameterName}\" from \"{SourceValue}\".");
+
+        public void RequiredParameterNotProvided(string parameterTypeName, string parameterName, string source)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Required parameter \"{0} {1}\" was not provided from {2}.", parameterTypeName, parameterName, source);
+                throw new BadHttpRequestException(message);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _requiredParameterNotProvided(_rdgLogger, parameterTypeName, parameterName, source, null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, string, string, Exception?> _requiredParameterNotProvided =
+            LoggerMessage.Define<string, string, string>(LogLevel.Debug, new EventId(4, "RequiredParameterNotProvided"), "Required parameter \"{ParameterType} {ParameterName}\" was not provided from {Source}.");
+
+        public void ImplicitBodyNotProvided(string parameterName)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Implicit body inferred for parameter \"{0}\" but no body was provided. Did you mean to use a Service instead?", parameterName);
+                throw new BadHttpRequestException(message);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _implicitBodyNotProvided(_rdgLogger, parameterName, null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, Exception?> _implicitBodyNotProvided =
+            LoggerMessage.Define<string>(LogLevel.Debug, new EventId(5, "ImplicitBodyNotProvided"), "Implicit body inferred for parameter \"{ParameterName}\" but no body was provided. Did you mean to use a Service instead?");
+
+        public void UnexpectedJsonContentType(string? contentType)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Expected a supported JSON media type but got \"{0}\".", contentType);
+                throw new BadHttpRequestException(message, StatusCodes.Status415UnsupportedMediaType);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _unexpectedJsonContentType(_rdgLogger, contentType ?? "(none)", null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, Exception?> _unexpectedJsonContentType =
+            LoggerMessage.Define<string>(LogLevel.Debug, new EventId(6, "UnexpectedContentType"), "Expected a supported JSON media type but got \"{ContentType}\".");
+
+        public void UnexpectedNonFormContentType(string? contentType)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Expected a supported form media type but got \"{0}\".", contentType);
+                throw new BadHttpRequestException(message, StatusCodes.Status415UnsupportedMediaType);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _unexpectedNonFormContentType(_rdgLogger, contentType ?? "(none)", null);
+            }
+        }
+
+        private static readonly Action<ILogger, string, Exception?> _unexpectedNonFormContentType =
+            LoggerMessage.Define<string>(LogLevel.Debug, new EventId(7, "UnexpectedNonFormContentType"), "Expected a supported form media type but got \"{ContentType}\".");
+
+        public void InvalidFormRequestBody(string parameterTypeName, string parameterName, Exception exception)
+        {
+            if (_shouldThrow)
+            {
+                var message = string.Format(CultureInfo.InvariantCulture, "Failed to read parameter \"{0} {1}\" from the request body as form.", parameterTypeName, parameterName);
+                throw new BadHttpRequestException(message, exception);
+            }
+
+            if (_rdgLogger != null)
+            {
+                _invalidFormRequestBody(_rdgLogger, parameterTypeName, parameterName, exception);
+            }
+        }
+
+        private static readonly Action<ILogger, string, string, Exception?> _invalidFormRequestBody =
+            LoggerMessage.Define<string, string>(LogLevel.Debug, new EventId(8, "InvalidFormRequestBody"), "Failed to read parameter \"{ParameterType} {ParameterName}\" from the request body as form.");
+    }
+}

+ 510 - 529
src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt

@@ -8,109 +8,16 @@
 //------------------------------------------------------------------------------
 #nullable enable
 
-namespace Microsoft.AspNetCore.Builder
+namespace System.Runtime.CompilerServices
 {
     %GENERATEDCODEATTRIBUTE%
-    internal sealed class SourceKey
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
+    file sealed class InterceptsLocationAttribute : Attribute
     {
-        public string Path { get; init; }
-        public int Line { get; init; }
-
-        public SourceKey(string path, int line)
+        public InterceptsLocationAttribute(string filePath, int line, int column)
         {
-            Path = path;
-            Line = line;
         }
     }
-
-    // This class needs to be internal so that the compiled application
-    // has access to the strongly-typed endpoint definitions that are
-    // generated by the compiler so that they will be favored by
-    // overload resolution and opt the runtime in to the code generated
-    // implementation produced here.
-    %GENERATEDCODEATTRIBUTE%
-    internal static class GenerateRouteBuilderEndpoints
-    {
-        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
-        private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
-
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, global::System.String> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                PostVerb,
-                filePath,
-                lineNumber);
-        }
-        internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet(
-            this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,
-            [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern,
-            global::System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType> handler,
-            [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "",
-            [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)
-        {
-            return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore(
-                endpoints,
-                pattern,
-                handler,
-                GetVerb,
-                filePath,
-                lineNumber);
-        }
-
-    }
 }
 
 namespace Microsoft.AspNetCore.Http.Generated
@@ -124,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated
     using System.Globalization;
     using System.Linq;
     using System.Reflection;
+    using System.Runtime.CompilerServices;
     using System.Text.Json;
     using System.Text.Json.Serialization.Metadata;
     using System.Threading.Tasks;
@@ -146,532 +54,605 @@ namespace Microsoft.AspNetCore.Http.Generated
     %GENERATEDCODEATTRIBUTE%
     file static class GeneratedRouteBuilderExtensionsCore
     {
+        private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get };
+private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post };
 
-        private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new()
+        [InterceptsLocation(@"TestMapActions.cs", 44, 5)]
+        internal static RouteHandlerBuilder MapGet0(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
         {
-            [(@"TestMapActions.cs", 44)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 44));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue>(0)!);
                             return ValueTask.FromResult<object?>(Results.Empty);
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                        }
+                        handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue>(0)!);
+                        return ValueTask.FromResult<object?>(Results.Empty);
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    // Endpoint Parameter: Value (Type = int, IsOptional = True, IsParsable = True, IsArray = False, Source = Route)
+                    if (options?.RouteParameterNames?.Contains("Value", StringComparer.OrdinalIgnoreCase) != true)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        // Endpoint Parameter: Value (Type = int, IsOptional = True, IsParsable = True, IsArray = False, Source = Route)
-                        if (options?.RouteParameterNames?.Contains("Value", StringComparer.OrdinalIgnoreCase) != true)
-                        {
-                            throw new InvalidOperationException($"'Value' is not a route parameter.");
-                        }
-                        var Value_raw = (string?)httpContext.Request.RouteValues["Value"];
-                        var Value_temp = (string?)Value_raw;
-                        global::System.Int32 Value_parsed_temp = default;
-                        if (GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(Value_temp!, CultureInfo.InvariantCulture, out var Value_temp_parsed_non_nullable))
-                        {
-                            Value_parsed_temp = Value_temp_parsed_non_nullable;
-                        }
-                        else if (string.IsNullOrEmpty(Value_temp))
-                        {
-                            Value_parsed_temp = 42;
-                        }
-                        else
-                        {
-                            wasParamCheckFailure = true;
-                        }
-                        int Value_local = Value_parsed_temp!;
+                        throw new InvalidOperationException($"'Value' is not a route parameter.");
+                    }
+                    var Value_raw = (string?)httpContext.Request.RouteValues["Value"];
+                    var Value_temp = (string?)Value_raw;
+                    global::System.Int32 Value_parsed_temp = default;
+                    if (GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(Value_temp!, CultureInfo.InvariantCulture, out var Value_temp_parsed_non_nullable))
+                    {
+                        Value_parsed_temp = Value_temp_parsed_non_nullable;
+                    }
+                    else if (string.IsNullOrEmpty(Value_temp))
+                    {
+                        Value_parsed_temp = 42;
+                    }
+                    else
+                    {
+                        wasParamCheckFailure = true;
+                    }
+                    int Value_local = Value_parsed_temp!;
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue(HttpContext_local, Value_local);
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue(HttpContext_local, Value_local);
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        handler(args_local);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                         return Task.CompletedTask;
                     }
+                    handler(args_local);
+                    return Task.CompletedTask;
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    // Endpoint Parameter: Value (Type = int, IsOptional = True, IsParsable = True, IsArray = False, Source = Route)
+                    if (options?.RouteParameterNames?.Contains("Value", StringComparer.OrdinalIgnoreCase) != true)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        // Endpoint Parameter: Value (Type = int, IsOptional = True, IsParsable = True, IsArray = False, Source = Route)
-                        if (options?.RouteParameterNames?.Contains("Value", StringComparer.OrdinalIgnoreCase) != true)
-                        {
-                            throw new InvalidOperationException($"'Value' is not a route parameter.");
-                        }
-                        var Value_raw = (string?)httpContext.Request.RouteValues["Value"];
-                        var Value_temp = (string?)Value_raw;
-                        global::System.Int32 Value_parsed_temp = default;
-                        if (GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(Value_temp!, CultureInfo.InvariantCulture, out var Value_temp_parsed_non_nullable))
-                        {
-                            Value_parsed_temp = Value_temp_parsed_non_nullable;
-                        }
-                        else if (string.IsNullOrEmpty(Value_temp))
-                        {
-                            Value_parsed_temp = 42;
-                        }
-                        else
-                        {
-                            wasParamCheckFailure = true;
-                        }
-                        int Value_local = Value_parsed_temp!;
+                        throw new InvalidOperationException($"'Value' is not a route parameter.");
+                    }
+                    var Value_raw = (string?)httpContext.Request.RouteValues["Value"];
+                    var Value_temp = (string?)Value_raw;
+                    global::System.Int32 Value_parsed_temp = default;
+                    if (GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(Value_temp!, CultureInfo.InvariantCulture, out var Value_temp_parsed_non_nullable))
+                    {
+                        Value_parsed_temp = Value_temp_parsed_non_nullable;
+                    }
+                    else if (string.IsNullOrEmpty(Value_temp))
+                    {
+                        Value_parsed_temp = 42;
+                    }
+                    else
+                    {
+                        wasParamCheckFailure = true;
+                    }
+                    int Value_local = Value_parsed_temp!;
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue(HttpContext_local, Value_local);
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue(HttpContext_local, Value_local);
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue>(httpContext, args_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue>(httpContext, args_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 45)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 45));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 45, 5)]
+        internal static RouteHandlerBuilder MapGet1(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var Value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("Value", options.RouteParameterNames);
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var Value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("Value", options.RouteParameterNames);
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct>(0)!);
                             return ValueTask.FromResult<object?>(Results.Empty);
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                        }
+                        handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct>(0)!);
+                        return ValueTask.FromResult<object?>(Results.Empty);
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    // Endpoint Parameter: Value (Type = int, IsOptional = False, IsParsable = True, IsArray = False, Source = RouteOrQuery)
+                    var Value_raw = Value_RouteOrQueryResolver(httpContext);
+                    if (Value_raw is StringValues { Count: 0 })
+                    {
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("int", "Value", "route or query string");
+                    }
+                    var Value_temp = (string?)Value_raw;
+                    if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(Value_temp!, CultureInfo.InvariantCulture, out var Value_parsed_temp))
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        // Endpoint Parameter: Value (Type = int, IsOptional = False, IsParsable = True, IsArray = False, Source = RouteOrQuery)
-                        var Value_raw = Value_RouteOrQueryResolver(httpContext);
-                        if (Value_raw is StringValues { Count: 0 })
+                        if (!string.IsNullOrEmpty(Value_temp))
                         {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("int", "Value", Value_temp);
                             wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("int", "Value", "route or query string");
                         }
-                        var Value_temp = (string?)Value_raw;
-                        if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(Value_temp!, CultureInfo.InvariantCulture, out var Value_parsed_temp))
-                        {
-                            if (!string.IsNullOrEmpty(Value_temp))
-                            {
-                                logOrThrowExceptionHelper.ParameterBindingFailed("int", "Value", Value_temp);
-                                wasParamCheckFailure = true;
-                            }
-                        }
-                        int Value_local = Value_parsed_temp!;
+                    }
+                    int Value_local = Value_parsed_temp!;
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct { HttpContext = HttpContext_local, Value = Value_local };
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct { HttpContext = HttpContext_local, Value = Value_local };
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        handler(args_local);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                         return Task.CompletedTask;
                     }
+                    handler(args_local);
+                    return Task.CompletedTask;
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    // Endpoint Parameter: Value (Type = int, IsOptional = False, IsParsable = True, IsArray = False, Source = RouteOrQuery)
+                    var Value_raw = Value_RouteOrQueryResolver(httpContext);
+                    if (Value_raw is StringValues { Count: 0 })
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        // Endpoint Parameter: Value (Type = int, IsOptional = False, IsParsable = True, IsArray = False, Source = RouteOrQuery)
-                        var Value_raw = Value_RouteOrQueryResolver(httpContext);
-                        if (Value_raw is StringValues { Count: 0 })
+                        wasParamCheckFailure = true;
+                        logOrThrowExceptionHelper.RequiredParameterNotProvided("int", "Value", "route or query string");
+                    }
+                    var Value_temp = (string?)Value_raw;
+                    if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(Value_temp!, CultureInfo.InvariantCulture, out var Value_parsed_temp))
+                    {
+                        if (!string.IsNullOrEmpty(Value_temp))
                         {
+                            logOrThrowExceptionHelper.ParameterBindingFailed("int", "Value", Value_temp);
                             wasParamCheckFailure = true;
-                            logOrThrowExceptionHelper.RequiredParameterNotProvided("int", "Value", "route or query string");
-                        }
-                        var Value_temp = (string?)Value_raw;
-                        if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit<int>(Value_temp!, CultureInfo.InvariantCulture, out var Value_parsed_temp))
-                        {
-                            if (!string.IsNullOrEmpty(Value_temp))
-                            {
-                                logOrThrowExceptionHelper.ParameterBindingFailed("int", "Value", Value_temp);
-                                wasParamCheckFailure = true;
-                            }
                         }
-                        int Value_local = Value_parsed_temp!;
+                    }
+                    int Value_local = Value_parsed_temp!;
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct { HttpContext = HttpContext_local, Value = Value_local };
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct { HttpContext = HttpContext_local, Value = Value_local };
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct>(httpContext, args_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct>(httpContext, args_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 46)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 46));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 46, 5)]
+        internal static RouteHandlerBuilder MapGet2(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext>(0)!);
                             return ValueTask.FromResult<object?>(Results.Empty);
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                        }
+                        handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext>(0)!);
+                        return ValueTask.FromResult<object?>(Results.Empty);
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    Task RequestHandler(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        var User_local = httpContext.User;
-                        var Request_local = httpContext.Request;
-                        var Response_local = httpContext.Response;
+                Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    var User_local = httpContext.User;
+                    var Request_local = httpContext.Request;
+                    var Response_local = httpContext.Response;
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext(HttpContext_local, User_local, Request_local, Response_local);
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext(HttpContext_local, User_local, Request_local, Response_local);
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return Task.CompletedTask;
-                        }
-                        handler(args_local);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                         return Task.CompletedTask;
                     }
+                    handler(args_local);
+                    return Task.CompletedTask;
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
-                    {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        var User_local = httpContext.User;
-                        var Request_local = httpContext.Request;
-                        var Response_local = httpContext.Response;
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    var User_local = httpContext.User;
+                    var Request_local = httpContext.Request;
+                    var Response_local = httpContext.Response;
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext(HttpContext_local, User_local, Request_local, Response_local);
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext(HttpContext_local, User_local, Request_local, Response_local);
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext>(httpContext, args_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
                     }
-
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 47)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 47));
-                    options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Func<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, global::System.String>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
-                    var Todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct>(logOrThrowExceptionHelper, "TodoStruct", "Todo", jsonOptions, serviceProviderIsService);
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext>(httpContext, args_local));
+                    if (result is not null)
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
-                        {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody>(0)!));
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    async Task RequestHandler(HttpContext httpContext)
+        [InterceptsLocation(@"TestMapActions.cs", 47, 5)]
+        internal static RouteHandlerBuilder MapPost3(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType));
+                options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
+                var Todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct>(logOrThrowExceptionHelper, "TodoStruct", "Todo", jsonOptions, serviceProviderIsService);
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
+                {
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        // Endpoint Parameter: Todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var Todo_resolveJsonBodyOrServiceResult = await Todo_JsonBodyOrServiceResolver(httpContext, false);
-                        var Todo_local = Todo_resolveJsonBodyOrServiceResult.Item2;
-                        if (!Todo_resolveJsonBodyOrServiceResult.Item1)
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            return;
+                            return ValueTask.FromResult<object?>(Results.Empty);
                         }
+                        return ValueTask.FromResult<object?>(handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody>(0)!));
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody(HttpContext_local, Todo_local);
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    // Endpoint Parameter: Todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var Todo_resolveJsonBodyOrServiceResult = await Todo_JsonBodyOrServiceResolver(httpContext, false);
+                    var Todo_local = Todo_resolveJsonBodyOrServiceResult.Item2;
+                    if (!Todo_resolveJsonBodyOrServiceResult.Item1)
+                    {
+                        return;
+                    }
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        var result = handler(args_local);
-                        if (result is string)
-                        {
-                            httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
-                        }
-                        else
-                        {
-                            httpContext.Response.ContentType ??= "application/json; charset=utf-8";
-                        }
-                        await httpContext.Response.WriteAsync(result);
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody(HttpContext_local, Todo_local);
+
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
+                    var result = handler(args_local);
+                    if (result is string)
+                    {
+                        httpContext.Response.ContentType ??= "text/plain; charset=utf-8";
+                    }
+                    else
+                    {
+                        httpContext.Response.ContentType ??= "application/json; charset=utf-8";
+                    }
+                    await httpContext.Response.WriteAsync(result);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    // Endpoint Parameter: Todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var Todo_resolveJsonBodyOrServiceResult = await Todo_JsonBodyOrServiceResolver(httpContext, false);
+                    var Todo_local = Todo_resolveJsonBodyOrServiceResult.Item2;
+                    if (!Todo_resolveJsonBodyOrServiceResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        // Endpoint Parameter: Todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var Todo_resolveJsonBodyOrServiceResult = await Todo_JsonBodyOrServiceResolver(httpContext, false);
-                        var Todo_local = Todo_resolveJsonBodyOrServiceResult.Item2;
-                        if (!Todo_resolveJsonBodyOrServiceResult.Item1)
-                        {
-                            return;
-                        }
+                        return;
+                    }
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody(HttpContext_local, Todo_local);
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody(HttpContext_local, Todo_local);
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody>(httpContext, args_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody>(httpContext, args_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
-            [(@"TestMapActions.cs", 48)] = (
-                (methodInfo, options) =>
-                {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 48));
-                    options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType));
-                    var parameterInfos = methodInfo.GetParameters();
-                    var Value_ParameterInfo = new PropertyAsParameterInfo(false, typeof(Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType)!.GetProperty("Value")!, typeof(Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType).GetConstructor(new[] { typeof(Microsoft.AspNetCore.Http.HttpContext), typeof(Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty) })?.GetParameters()[1]);
-                    PopulateMetadataForParameter<global::Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty>(Value_ParameterInfo, options.EndpointBuilder);
-                    PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty>(methodInfo, options.EndpointBuilder);
-                    return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
-                },
-                (del, options, inferredMetadataResult) =>
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                PostVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
+
+        [InterceptsLocation(@"TestMapActions.cs", 48, 5)]
+        internal static RouteHandlerBuilder MapGet4(
+            this IEndpointRouteBuilder endpoints,
+            [StringSyntax("Route")] string pattern,
+            Delegate handler)
+        {
+            MetadataPopulator populateMetadata = (methodInfo, options) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42"));
+                options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType));
+                var parameterInfos = methodInfo.GetParameters();
+                var Value_ParameterInfo = new PropertyAsParameterInfo(false, typeof(Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType)!.GetProperty("Value")!, typeof(Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType).GetConstructor(new[] { typeof(Microsoft.AspNetCore.Http.HttpContext), typeof(Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty) })?.GetParameters()[1]);
+                PopulateMetadataForParameter<global::Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty>(Value_ParameterInfo, options.EndpointBuilder);
+                PopulateMetadataForEndpoint<global::Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty>(methodInfo, options.EndpointBuilder);
+                return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };
+            };
+            RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>
+            {
+                Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
+                Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
+                Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
+                Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
+                var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType arg0) => throw null!);
+                EndpointFilterDelegate? filteredInvocation = null;
+                var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
+                var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
+                var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
+                var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
+                var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
+                var Value_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty>(logOrThrowExceptionHelper, "AddsCustomParameterMetadataAsProperty", "Value", jsonOptions, serviceProviderIsService);
+
+                if (options.EndpointBuilder.FilterFactories.Count > 0)
                 {
-                    Debug.Assert(options != null, "RequestDelegateFactoryOptions not found.");
-                    Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found.");
-                    Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found.");
-                    Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found.");
-                    var handler = (System.Action<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType>)del;
-                    EndpointFilterDelegate? filteredInvocation = null;
-                    var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;
-                    var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
-                    var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
-                    var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
-                    var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
-                    var Value_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty>(logOrThrowExceptionHelper, "AddsCustomParameterMetadataAsProperty", "Value", jsonOptions, serviceProviderIsService);
-
-                    if (options.EndpointBuilder.FilterFactories.Count > 0)
+                    filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
                     {
-                        filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>
+                        if (ic.HttpContext.Response.StatusCode == 400)
                         {
-                            if (ic.HttpContext.Response.StatusCode == 400)
-                            {
-                                return ValueTask.FromResult<object?>(Results.Empty);
-                            }
-                            handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType>(0)!);
                             return ValueTask.FromResult<object?>(Results.Empty);
-                        },
-                        options.EndpointBuilder,
-                        handler.Method);
-                    }
+                        }
+                        handler(ic.GetArgument<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType>(0)!);
+                        return ValueTask.FromResult<object?>(Results.Empty);
+                    },
+                    options.EndpointBuilder,
+                    handler.Method);
+                }
 
-                    async Task RequestHandler(HttpContext httpContext)
+                async Task RequestHandler(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    // Endpoint Parameter: Value (Type = Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var Value_resolveJsonBodyOrServiceResult = await Value_JsonBodyOrServiceResolver(httpContext, false);
+                    var Value_local = Value_resolveJsonBodyOrServiceResult.Item2;
+                    if (!Value_resolveJsonBodyOrServiceResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        // Endpoint Parameter: Value (Type = Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var Value_resolveJsonBodyOrServiceResult = await Value_JsonBodyOrServiceResolver(httpContext, false);
-                        var Value_local = Value_resolveJsonBodyOrServiceResult.Item2;
-                        if (!Value_resolveJsonBodyOrServiceResult.Item1)
-                        {
-                            return;
-                        }
+                        return;
+                    }
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType(HttpContext_local, Value_local);
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType(HttpContext_local, Value_local);
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                            return;
-                        }
-                        handler(args_local);
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                        return;
                     }
+                    handler(args_local);
+                }
 
-                    async Task RequestHandlerFiltered(HttpContext httpContext)
+                async Task RequestHandlerFiltered(HttpContext httpContext)
+                {
+                    var wasParamCheckFailure = false;
+                    // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
+                    var HttpContext_local = httpContext;
+                    // Endpoint Parameter: Value (Type = Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
+                    var Value_resolveJsonBodyOrServiceResult = await Value_JsonBodyOrServiceResolver(httpContext, false);
+                    var Value_local = Value_resolveJsonBodyOrServiceResult.Item2;
+                    if (!Value_resolveJsonBodyOrServiceResult.Item1)
                     {
-                        var wasParamCheckFailure = false;
-                        // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters)
-                        var HttpContext_local = httpContext;
-                        // Endpoint Parameter: Value (Type = Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService)
-                        var Value_resolveJsonBodyOrServiceResult = await Value_JsonBodyOrServiceResolver(httpContext, false);
-                        var Value_local = Value_resolveJsonBodyOrServiceResult.Item2;
-                        if (!Value_resolveJsonBodyOrServiceResult.Item1)
-                        {
-                            return;
-                        }
+                        return;
+                    }
 
-                        var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType(HttpContext_local, Value_local);
+                    var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType(HttpContext_local, Value_local);
 
-                        if (wasParamCheckFailure)
-                        {
-                            httpContext.Response.StatusCode = 400;
-                        }
-                        var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType>(httpContext, args_local));
-                        if (result is not null)
-                        {
-                            await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
-                        }
+                    if (wasParamCheckFailure)
+                    {
+                        httpContext.Response.StatusCode = 400;
+                    }
+                    var result = await filteredInvocation(EndpointFilterInvocationContext.Create<global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType>(httpContext, args_local));
+                    if (result is not null)
+                    {
+                        await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo);
                     }
+                }
+
+                RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
+                var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
+                return new RequestDelegateResult(targetDelegate, metadata);
+            };
+            return MapCore(
+                endpoints,
+                pattern,
+                handler,
+                GetVerb,
+                populateMetadata,
+                createRequestDelegate);
+        }
 
-                    RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered;
-                    var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection<object>.Empty;
-                    return new RequestDelegateResult(targetDelegate, metadata);
-                }),
 
-        };
 
         internal static RouteHandlerBuilder MapCore(
             this IEndpointRouteBuilder routes,
             string pattern,
             Delegate handler,
             IEnumerable<string>? httpMethods,
-            string filePath,
-            int lineNumber)
+            MetadataPopulator populateMetadata,
+            RequestDelegateFactoryFunc createRequestDelegate)
         {
-            var (populateMetadata, createRequestDelegate) = map[(filePath, lineNumber)];
             return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate);
         }
 
+        private static T Cast<T>(Delegate d, T _) where T : Delegate
+        {
+            return (T)d;
+        }
+
         private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi)
         {
             var routeHandlerFilters =  builder.FilterFactories;

+ 91 - 0
src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs

@@ -1,7 +1,11 @@
 // Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
+using System.Collections.Immutable;
+using System.Text;
 using Microsoft.CodeAnalysis;
 using Microsoft.AspNetCore.Http.RequestDelegateGenerator;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.Text;
 
 namespace Microsoft.AspNetCore.Http.Generators.Tests;
 
@@ -37,4 +41,91 @@ app.MapGet("/hello", (HttpContext context) => Task.CompletedTask);
         var exception = await Assert.ThrowsAsync<InvalidOperationException>(() => endpoint.RequestDelegate(httpContext));
         Assert.Equal("'invalidName' is not a route parameter.", exception.Message);
     }
+
+    [Fact]
+    public async Task SupportsSameInterceptorsFromDifferentFiles()
+    {
+        var project = CreateProject();
+        var source = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");app.MapGet("/bye", (string name) => "Bye {name}!");""");
+        var otherSource = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");""", "OtherTestMapActions");
+        project = project.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8)).Project;
+        project = project.AddDocument("OtherTestMapActions.cs", SourceText.From(otherSource, Encoding.UTF8)).Project;
+        var compilation = await project.GetCompilationAsync();
+
+        var generator = new RequestDelegateGenerator.RequestDelegateGenerator().AsSourceGenerator();
+        GeneratorDriver driver = CSharpGeneratorDriver.Create(generators: new[]
+            {
+                generator
+            },
+            driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true),
+            parseOptions: ParseOptions);
+        driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation,
+            out var _);
+
+        var diagnostics = updatedCompilation.GetDiagnostics();
+        Assert.Empty(diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Warning));
+
+        await VerifyAgainstBaselineUsingFile(updatedCompilation);
+    }
+
+    [Fact]
+    public async Task SupportsDifferentInterceptorsFromSameLocation()
+    {
+        var project = CreateProject();
+        var source = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");""");
+        var otherSource = GetMapActionString("""app.MapGet("/", (int age) => "Hello {age}!");""", "OtherTestMapActions");
+        project = project.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8)).Project;
+        project = project.AddDocument("OtherTestMapActions.cs", SourceText.From(otherSource, Encoding.UTF8)).Project;
+        var compilation = await project.GetCompilationAsync();
+
+        var generator = new RequestDelegateGenerator.RequestDelegateGenerator().AsSourceGenerator();
+        GeneratorDriver driver = CSharpGeneratorDriver.Create(generators: new[]
+            {
+                generator
+            },
+            driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true),
+            parseOptions: ParseOptions);
+        driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation,
+            out var _);
+
+        var diagnostics = updatedCompilation.GetDiagnostics();
+        Assert.Empty(diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Warning));
+
+        await VerifyAgainstBaselineUsingFile(updatedCompilation);
+    }
+
+    [Fact]
+    public async Task SourceMapsAllPathsInAttribute()
+    {
+        var currentDirectory = Directory.GetCurrentDirectory();
+        var mappedDirectory = Path.Combine(currentDirectory, "path", "mapped");
+        var project = CreateProject(modifyCompilationOptions:
+            (options) =>
+            {
+                return options.WithSourceReferenceResolver(
+                    new SourceFileResolver(ImmutableArray<string>.Empty, currentDirectory, ImmutableArray.Create(new KeyValuePair<string, string>(currentDirectory, mappedDirectory))));
+            });
+        var source = GetMapActionString("""app.MapGet("/", () => "Hello world!");""");
+        project = project.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8), filePath: Path.Combine(currentDirectory, "TestMapActions.cs")).Project;
+        var compilation = await project.GetCompilationAsync();
+
+        var generator = new RequestDelegateGenerator.RequestDelegateGenerator().AsSourceGenerator();
+        GeneratorDriver driver = CSharpGeneratorDriver.Create(generators: new[]
+            {
+                generator
+            },
+            driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true),
+            parseOptions: ParseOptions);
+        driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation,
+            out var diags);
+
+        var diagnostics = updatedCompilation.GetDiagnostics();
+        Assert.Empty(diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Warning));
+
+        var endpoint = GetEndpointFromCompilation(updatedCompilation);
+        var httpContext = CreateHttpContext();
+
+        await endpoint.RequestDelegate(httpContext);
+        await VerifyResponseBodyAsync(httpContext, "Hello world!");
+    }
 }

+ 30 - 20
src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs

@@ -1,6 +1,8 @@
 // Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
+using System.CodeDom.Compiler;
+using System.Collections.Immutable;
 using System.Globalization;
 using System.IO.Pipelines;
 using System.Reflection;
@@ -16,6 +18,7 @@ using Microsoft.AspNetCore.Routing;
 using Microsoft.AspNetCore.Testing;
 using Microsoft.CodeAnalysis;
 using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.Diagnostics;
 using Microsoft.CodeAnalysis.Emit;
 using Microsoft.CodeAnalysis.Text;
 using Microsoft.Extensions.DependencyInjection;
@@ -31,12 +34,11 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest
 
     protected abstract bool IsGeneratorEnabled { get; }
 
+    internal static readonly CSharpParseOptions ParseOptions = new CSharpParseOptions(LanguageVersion.Preview).WithFeatures(new[] { new KeyValuePair<string, string>("InterceptorsPreview", "") });
     private static readonly Project _baseProject = CreateProject();
 
     internal async Task<(GeneratorRunResult?, Compilation)> RunGeneratorAsync(string sources, params string[] updatedSources)
     {
-        var source = GetMapActionString(sources);
-        var project = _baseProject.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8)).Project;
         // Create a Roslyn compilation for the syntax tree.
         var compilation = await CreateCompilationAsync(sources);
 
@@ -55,12 +57,13 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest
             {
                 generator
             },
-            driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true));
+            driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true),
+            parseOptions: ParseOptions);
         driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation,
             out var _);
         foreach (var updatedSource in updatedSources)
         {
-            var syntaxTree = CSharpSyntaxTree.ParseText(GetMapActionString(updatedSource), path: $"TestMapActions.cs");
+            var syntaxTree = CSharpSyntaxTree.ParseText(GetMapActionString(updatedSource), path: $"TestMapActions.cs", options: ParseOptions);
             compilation = compilation
                 .ReplaceSyntaxTree(compilation.SyntaxTrees.First(), syntaxTree);
             driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out updatedCompilation,
@@ -106,14 +109,14 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest
         }
     }
 
-    internal Endpoint GetEndpointFromCompilation(Compilation compilation, bool? expectSourceKeyOverride = null, IServiceProvider serviceProvider = null) =>
-        Assert.Single(GetEndpointsFromCompilation(compilation, expectSourceKeyOverride, serviceProvider));
+    internal Endpoint GetEndpointFromCompilation(Compilation compilation, bool? expectGeneratedCodeOverride = null, IServiceProvider serviceProvider = null) =>
+        Assert.Single(GetEndpointsFromCompilation(compilation, expectGeneratedCodeOverride, serviceProvider));
 
-    internal Endpoint[] GetEndpointsFromCompilation(Compilation compilation, bool? expectSourceKeyOverride = null, IServiceProvider serviceProvider = null)
+    internal Endpoint[] GetEndpointsFromCompilation(Compilation compilation, bool? expectGeneratedCodeOverride = null, IServiceProvider serviceProvider = null)
     {
         var assemblyName = compilation.AssemblyName!;
         var symbolsName = Path.ChangeExtension(assemblyName, "pdb");
-        var expectSourceKey = (expectSourceKeyOverride ?? true) && IsGeneratorEnabled;
+        var expectGeneratedCode = (expectGeneratedCodeOverride ?? true) && IsGeneratorEnabled;
 
         var output = new MemoryStream();
         var pdb = new MemoryStream();
@@ -134,7 +137,7 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest
             var sourceText = SourceText.From(buffer, buffer.Length, encoding, canBeEmbedded: true);
 
             var syntaxRootNode = (CSharpSyntaxNode)syntaxTree.GetRoot();
-            var newSyntaxTree = CSharpSyntaxTree.Create(syntaxRootNode, options: null, encoding: encoding, path: syntaxTree.FilePath);
+            var newSyntaxTree = CSharpSyntaxTree.Create(syntaxRootNode, options: ParseOptions, encoding: encoding, path: syntaxTree.FilePath);
 
             compilation = compilation.ReplaceSyntaxTree(syntaxTree, newSyntaxTree);
 
@@ -153,7 +156,6 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest
         var handler = assembly.GetType("TestMapActions")
             ?.GetMethod("MapTestEndpoints", BindingFlags.Public | BindingFlags.Static)
             ?.CreateDelegate<Func<IEndpointRouteBuilder, IEndpointRouteBuilder>>();
-        var sourceKeyType = assembly.GetType("Microsoft.AspNetCore.Builder.SourceKey");
 
         Assert.NotNull(handler);
 
@@ -167,15 +169,18 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest
 
         foreach (var endpoint in endpoints)
         {
-            var sourceKeyMetadata = endpoint.Metadata.FirstOrDefault(metadata => metadata.GetType() == sourceKeyType);
+            var generatedCodeAttribute = endpoint.Metadata.OfType<GeneratedCodeAttribute>().SingleOrDefault();
 
-            if (expectSourceKey)
+            if (expectGeneratedCode)
             {
-                Assert.NotNull(sourceKeyMetadata);
+                Assert.NotNull(generatedCodeAttribute);
+                var generatedCode = Assert.IsType<GeneratedCodeAttribute>(generatedCodeAttribute);
+                Assert.Equal(typeof(RequestDelegateGeneratorSources).Assembly.FullName, generatedCode.Tool);
+                Assert.Equal(typeof(RequestDelegateGeneratorSources).Assembly.GetName().Version?.ToString(), generatedCode.Version);
             }
             else
             {
-                Assert.Null(sourceKeyMetadata);
+                Assert.Null(generatedCodeAttribute);
             }
         }
 
@@ -254,7 +259,7 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest
         Assert.Equal(expectedBody, body);
     }
 
-    private static string GetMapActionString(string sources) => $$"""
+    internal static string GetMapActionString(string sources, string className = "TestMapActions") => $$"""
 #nullable enable
 using System;
 using System.Collections.Generic;
@@ -275,7 +280,7 @@ using Microsoft.AspNetCore.Routing;
 using Microsoft.AspNetCore.Http.Generators.Tests;
 using Microsoft.Extensions.Primitives;
 
-public static class TestMapActions
+public static class {{className}}
 {
     public static IEndpointRouteBuilder MapTestEndpoints(this IEndpointRouteBuilder app)
     {
@@ -294,14 +299,19 @@ public static class TestMapActions
         return project.GetCompilationAsync();
     }
 
-    private static Project CreateProject()
+    internal static Project CreateProject(Func<CSharpCompilationOptions, CSharpCompilationOptions> modifyCompilationOptions = null)
     {
         var projectName = $"TestProject-{Guid.NewGuid()}";
+        var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
+                .WithNullableContextOptions(NullableContextOptions.Enable);
+        if (modifyCompilationOptions is not null)
+        {
+            compilationOptions = modifyCompilationOptions(compilationOptions);
+        }
         var project = new AdhocWorkspace().CurrentSolution
             .AddProject(projectName, projectName, LanguageNames.CSharp)
-            .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
-                .WithNullableContextOptions(NullableContextOptions.Enable))
-            .WithParseOptions(new CSharpParseOptions(LanguageVersion.CSharp11));
+            .WithCompilationOptions(compilationOptions)
+            .WithParseOptions(ParseOptions);
 
         // Add in required metadata references
         var resolver = new AppLocalResolver();

+ 2 - 1
src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs

@@ -16,6 +16,7 @@ using Microsoft.AspNetCore.Routing;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Primitives;
 using System;
+using System.CodeDom.Compiler;
 
 namespace Microsoft.AspNetCore.Http.Generators.Tests;
 
@@ -499,7 +500,7 @@ app.MapPost("/test/pattern", [Attribute1, Attribute2] (AddsCustomParameterMetada
         //       of this test from RDF.
         var filteredMetadata = endpoint.Metadata.Where(
             m => m.GetType().Name != "NullableContextAttribute" &&
-            m.GetType().Name != "SourceKey" &&
+            m is not GeneratedCodeAttribute &&
             m is not MethodInfo &&
             m is not HttpMethodMetadata &&
             m is not Attribute1 &&

+ 1 - 0
src/Http/samples/MinimalSample/MinimalSample.csproj

@@ -5,6 +5,7 @@
     <Nullable>enable</Nullable>
     <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
     <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
+    <IsTrimmable>true</IsTrimmable>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 0
src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj

@@ -9,6 +9,7 @@
     <IsPackable>false</IsPackable>
     <IsTrimmable>true</IsTrimmable>
     <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
+    <Features>$(Features);InterceptorsPreview</Features>
   </PropertyGroup>
 
   <ItemGroup>

+ 6 - 0
src/Shared/RoslynUtils/CodeWriter.cs

@@ -30,6 +30,12 @@ internal sealed class CodeWriter : IndentedTextWriter
         this.WriteLine("},");
     }
 
+    public void EndBlockWithSemicolon()
+    {
+        this.Indent--;
+        this.WriteLine("};");
+    }
+
     // The IndentedTextWriter adds the indentation
     // _after_ writing the first line of text. This
     // method can be used ot initialize indentation

+ 39 - 0
src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs

@@ -0,0 +1,39 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using Microsoft.CodeAnalysis;
+
+internal static class IncrementalValuesProviderExtensions
+{
+    public static IncrementalValuesProvider<(TSource Source, int Index, ImmutableArray<TElement> Elements)> GroupWith<TSource, TElement>(
+        this IncrementalValuesProvider<TSource> source,
+        Func<TSource, TElement> sourceToElementTransform,
+        IEqualityComparer<TSource> comparer)
+    {
+        return source.Collect().SelectMany((values, _) =>
+        {
+            Dictionary<TSource, ImmutableArray<TElement>.Builder> map = new(comparer);
+            foreach (var value in values)
+            {
+                if (!map.TryGetValue(value, out ImmutableArray<TElement>.Builder builder))
+                {
+                    builder = ImmutableArray.CreateBuilder<TElement>();
+                    map.Add(value, builder);
+                }
+                builder.Add(sourceToElementTransform(value));
+            }
+            ImmutableArray<(TSource Key, int Index, ImmutableArray<TElement> Elements)>.Builder result =
+                ImmutableArray.CreateBuilder<(TSource, int, ImmutableArray<TElement>)>();
+            var index = 0;
+            foreach (var entry in map)
+            {
+                result.Add((entry.Key, index, entry.Value.ToImmutable()));
+                index++;
+            }
+            return result;
+        });
+    }
+}

+ 5 - 14
src/Shared/RoslynUtils/SyntaxTreeExtensions.cs

@@ -6,18 +6,9 @@ using Microsoft.CodeAnalysis.Text;
 
 internal static class SyntaxTreeExtensions
 {
-    // Utilize the same logic used by the `CallerLinePathAttribute` for generating
-    // a file path for a given syntax tree.
-    // Source copied from https://github.com/dotnet/roslyn/blob/5b47c7fe326faa35940f220c14f718cd0b820c38/src/Compilers/Core/Portable/Syntax/SyntaxTree.cs#L274-L293 until
-    // public APIs are available.
-    internal static string GetDisplayPath(this SyntaxTree tree, TextSpan span, SourceReferenceResolver? resolver)
-    {
-        var mappedSpan = tree.GetMappedLineSpan(span);
-        if (resolver == null || mappedSpan.Path.Length == 0)
-        {
-            return mappedSpan.Path;
-        }
-
-        return resolver.NormalizePath(mappedSpan.Path, baseFilePath: mappedSpan.HasMappedPath ? tree.FilePath : null) ?? mappedSpan.Path;
-    }
+    // Utilize the same logic used by the interceptors API for resolving the source mapped
+    // value of a path.
+    // https://github.com/dotnet/roslyn/blob/f290437fcc75dad50a38c09e0977cce13a64f5ba/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs#L1063-L1064
+    internal static string GetInterceptorFilePath(this SyntaxTree tree, SourceReferenceResolver? resolver) =>
+        resolver?.NormalizePath(tree.FilePath, baseFilePath: null) ?? tree.FilePath;
 }