diff --git a/eng/SourceBuildPrebuiltBaseline.xml b/eng/SourceBuildPrebuiltBaseline.xml index 915005ae07dd..5e8c3b3f216f 100644 --- a/eng/SourceBuildPrebuiltBaseline.xml +++ b/eng/SourceBuildPrebuiltBaseline.xml @@ -12,7 +12,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 36e834d2654d..c6001e84985b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -194,6 +194,11 @@ 7f9ae67f86a5adc1d9bf2f22f4bf3ec05b6d7b68 + + https://github.com/dotnet/symreader + 27e584661980ee6d82c419a2a471ae505b7d122e + + https://github.com/dotnet/runtime 37c0371ab3f7651d64a6dfe4c2e8677206fa34ee @@ -335,22 +340,22 @@ - + https://github.com/dotnet/roslyn - 65df6b1065bae316232a6c9907a8be995302fb5e + 28075742c870be732a3f20fcfc540a915bc51820 - + https://github.com/dotnet/roslyn - 65df6b1065bae316232a6c9907a8be995302fb5e + 28075742c870be732a3f20fcfc540a915bc51820 - + https://github.com/dotnet/roslyn - 65df6b1065bae316232a6c9907a8be995302fb5e + 28075742c870be732a3f20fcfc540a915bc51820 - + https://github.com/dotnet/roslyn - 65df6b1065bae316232a6c9907a8be995302fb5e + 28075742c870be732a3f20fcfc540a915bc51820 diff --git a/eng/Versions.props b/eng/Versions.props index 9dd290771aeb..b9b352c8cf5e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -144,10 +144,10 @@ 8.0.0-preview.6.23312.10 8.0.0-preview.6.23312.10 - 4.4.0-4.22520.2 - 4.4.0-4.22520.2 - 4.4.0-4.22520.2 - 4.4.0-4.22520.2 + 4.7.0-3.23313.12 + 4.7.0-3.23313.12 + 4.7.0-3.23313.12 + 4.7.0-3.23313.12 6.2.2 @@ -163,6 +163,8 @@ 8.0.0-alpha.1.23305.2 8.0.0-alpha.1.23312.2 + + 2.0.0-beta-23228-03 7.0.0-preview.22423.2 @@ -239,11 +241,11 @@ 3.3.1 - 4.5.0 - 4.4.0-4.22520.2 - 4.4.0-4.22520.2 - 4.4.0-4.22520.2 - 4.4.0-4.22520.2 + 4.7.0-3.23313.12 + 4.7.0-3.23313.12 + 4.7.0-3.23313.12 + 4.7.0-3.23313.12 + 4.7.0-3.23313.12 3.3.3 1.1.2-beta1.22531.1 1.1.2-beta1.22531.1 diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Microsoft.AspNetCore.App.Analyzers.csproj b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Microsoft.AspNetCore.App.Analyzers.csproj index 43d258fb37a2..97439d9a3d20 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Microsoft.AspNetCore.App.Analyzers.csproj +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Microsoft.AspNetCore.App.Analyzers.csproj @@ -8,6 +8,7 @@ Enable Microsoft.AspNetCore.Analyzers true + true diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Resources.resx b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Resources.resx index f3a1901a5ff4..c4347a2b8797 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Resources.resx +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Resources.resx @@ -1,17 +1,17 @@ - @@ -211,7 +211,7 @@ Route handler has multiple parameters with the [FromBody] attribute or a parameter with an [AsParameters] attribute where the parameter type contains multiple members with [FromBody] attributes. Only one parameter can have a [FromBody] attribute. - Route handler has multiple parameters with the [FromBody] attribute. + Route handler has multiple parameters with the [FromBody] attribute Do not use model binding attributes with route handlers @@ -289,10 +289,10 @@ Complex types referenced by route parameters must be parsable - Parameter '{0}' of type {1} should define a bool TryParse(string, IFormatProvider, out {1}) method, or implement IParsable<{1}>. + Parameter '{0}' of type {1} should define a bool TryParse(string, IFormatProvider, out {1}) method, or implement IParsable<{1}> - When implementing BindAsync(...) method, the return type must be ValueTask<T>. + When implementing BindAsync(...) method, the return type must be ValueTask<T> Parameter '{0}' of type {1} has a BindAsync(...) method, but the return type is not ValueTask<{1}>. Consider implementing IBindableFromHttpContext<{1}> to enforce implementation. @@ -310,7 +310,7 @@ Route '{0}' conflicts with another action route. An HTTP request that matches multiple routes results in an ambiguous match error. Fix the conflict by changing the route's pattern, HTTP method, or route constraints. - Use AddAuthorizationBuilder to register authorization services and construct policies. + Use AddAuthorizationBuilder to register authorization services and construct policies Use AddAuthorizationBuilder diff --git a/src/Framework/AspNetCoreAnalyzers/test/Microsoft.AspNetCore.App.Analyzers.Test.csproj b/src/Framework/AspNetCoreAnalyzers/test/Microsoft.AspNetCore.App.Analyzers.Test.csproj index 02dc9b4e3d49..5f223d266110 100644 --- a/src/Framework/AspNetCoreAnalyzers/test/Microsoft.AspNetCore.App.Analyzers.Test.csproj +++ b/src/Framework/AspNetCoreAnalyzers/test/Microsoft.AspNetCore.App.Analyzers.Test.csproj @@ -4,6 +4,8 @@ $(DefaultNetCoreTargetFramework) true Microsoft.AspNetCore.Analyzers + + $(NoWarn);RS1036;RS2008 diff --git a/src/Http/Http.Extensions/gen/GeneratorSteps.cs b/src/Http/Http.Extensions/gen/GeneratorSteps.cs index 2608f97a1ee6..a90776d30178 100644 --- a/src/Http/Http.Extensions/gen/GeneratorSteps.cs +++ b/src/Http/Http.Extensions/gen/GeneratorSteps.cs @@ -5,5 +5,8 @@ namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator; internal class GeneratorSteps { internal const string EndpointModelStep = nameof(EndpointModelStep); - internal const string EndpointsWithoutDiagnosicsStep = nameof(EndpointsWithoutDiagnosicsStep); + internal const string EndpointsWithoutDiagnosticsStep = nameof(EndpointsWithoutDiagnosticsStep); + internal const string EndpointsInterceptorsStep = nameof(EndpointsInterceptorsStep); + internal const string EndpointsHelperMethodsStep = nameof(EndpointsHelperMethodsStep); + internal const string EndpointsHelperTypesStep = nameof(EndpointsHelperTypesStep); } diff --git a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs index ca4e7cc17dcd..02b26bcfda08 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs @@ -9,8 +9,8 @@ using Microsoft.AspNetCore.App.Analyzers.Infrastructure; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Operations; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.CodeAnalysis.CSharp; namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator; @@ -53,126 +53,113 @@ public void Initialize(IncrementalGeneratorInitializationContext context) var endpoints = endpointsWithDiagnostics .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;"); - if (endpoint.EmitterContext.RequiresLoggingHelper || endpoint.EmitterContext.HasJsonBodyOrService || endpoint.Response?.IsSerializableJsonResponse(out var _) is true) - { - codeWriter.WriteLine("var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;"); - } - endpoint.EmitLoggingPreamble(codeWriter); - endpoint.EmitRouteOrQueryResolver(codeWriter); - endpoint.EmitJsonBodyOrServiceResolver(codeWriter); - endpoint.Response?.EmitJsonPreparation(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(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.Empty;"); - codeWriter.WriteLine("return new RequestDelegateResult(targetDelegate, metadata);"); - codeWriter.Indent--; - codeWriter.Write("}),"); - return stringWriter.ToString(); - }); + .WithTrackingName(GeneratorSteps.EndpointsWithoutDiagnosticsStep); var stronglyTypedEndpointDefinitions = endpoints - .Collect() - .Select((endpoints, _) => + .Select((endpoint, _) => { - var dedupedByDelegate = endpoints.Distinct(EndpointDelegateComparer.Instance); using var stringWriter = new StringWriter(CultureInfo.InvariantCulture); using var codeWriter = new CodeWriter(stringWriter, baseIndent: 2); - foreach (var endpoint in dedupedByDelegate) + codeWriter.WriteLine($$"""[InterceptsLocation(@"{{endpoint.Location.File}}", {{endpoint.Location.LineNumber}}, {{endpoint.Location.CharacterNumber}})]"""); + codeWriter.WriteLine($"internal static RouteHandlerBuilder {endpoint.HttpMethod}_{endpoint.Location.LineNumber}_{endpoint.Location.CharacterNumber}("); + 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($"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 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("IEnumerable 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 SourceKey{endpoint.EmitSourceKey()});"); + 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("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(Results.Empty);"); + codeWriter.EndBlock(); + endpoint.EmitFilteredInvocation(codeWriter); + codeWriter.EndBlockWithComma(); + codeWriter.WriteLine("options.EndpointBuilder,"); + codeWriter.WriteLine("handler.Method);"); + codeWriter.EndBlock(); + codeWriter.WriteLineNoTabs(string.Empty); + + if (endpoint.EmitterContext.RequiresLoggingHelper || endpoint.EmitterContext.HasJsonBodyOrService || endpoint.Response?.IsSerializableJsonResponse(out var _) is true) + { + codeWriter.WriteLine("var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;"); + } + endpoint.EmitLoggingPreamble(codeWriter); + endpoint.EmitRouteOrQueryResolver(codeWriter); + endpoint.EmitJsonBodyOrServiceResolver(codeWriter); + endpoint.Response?.EmitJsonPreparation(codeWriter); + if (endpoint.NeedsParameterArray) + { + codeWriter.WriteLine("var parameters = del.Method.GetParameters();"); + } + 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.Empty;"); + codeWriter.WriteLine("return new RequestDelegateResult(targetDelegate, metadata);"); + codeWriter.EndBlockWithSemicolon(); + + codeWriter.WriteLine("return 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("populateMetadata,"); + codeWriter.WriteLine($"createRequestDelegate);"); + codeWriter.Indent--; + codeWriter.EndBlock(); return stringWriter.ToString(); - }); + }) + .WithTrackingName(GeneratorSteps.EndpointsInterceptorsStep); - var endpointHelpers = endpoints + var helperMethods = endpoints .Collect() .Select((endpoints, _) => { @@ -242,7 +229,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context) } return stringWriter.ToString(); - }); + }) + .WithTrackingName(GeneratorSteps.EndpointsHelperMethodsStep); var helperTypes = endpoints .Collect() @@ -277,29 +265,28 @@ public void Initialize(IncrementalGeneratorInitializationContext context) } return stringWriter.ToString(); - }); + }) + .WithTrackingName(GeneratorSteps.EndpointsHelperTypesStep); - var thunksAndEndpoints = thunks.Collect().Combine(stronglyTypedEndpointDefinitions).Combine(endpointHelpers).Combine(helperTypes); + var thunksAndEndpoints = stronglyTypedEndpointDefinitions.Collect().Combine(helperMethods).Combine(helperTypes); context.RegisterSourceOutput(thunksAndEndpoints, (context, sources) => { - var (((thunks, endpointsCode), helperMethods), helperTypes) = sources; + var ((endpointsCode, helperMethods), helperTypes) = sources; - if (thunks.IsDefaultOrEmpty || string.IsNullOrEmpty(endpointsCode)) + if (endpointsCode.IsDefaultOrEmpty) { return; } - var thunksCode = new StringBuilder(); - foreach (var thunk in thunks) + var endpoints = new StringBuilder(); + foreach (var thunk in endpointsCode) { - thunksCode.AppendLine(thunk); + endpoints.AppendLine(thunk); } var code = RequestDelegateGeneratorSources.GetGeneratedRouteBuilderExtensionsSource( - genericThunks: string.Empty, - thunks: thunksCode.ToString(), - endpoints: endpointsCode, + endpoints: endpoints.ToString(), helperMethods: helperMethods ?? string.Empty, helperTypes: helperTypes ?? string.Empty); diff --git a/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs index 699b9421e269..43cc459762dd 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs @@ -500,7 +500,7 @@ public override bool IsDefined(Type attributeType, bool inherit) } """; - public static string GetGeneratedRouteBuilderExtensionsSource(string genericThunks, string thunks, string endpoints, string helperMethods, string helperTypes) => $$""" + public static string GetGeneratedRouteBuilderExtensionsSource(string endpoints, string helperMethods, string helperTypes) => $$""" {{SourceHeader}} namespace Microsoft.AspNetCore.Builder @@ -517,8 +517,18 @@ public SourceKey(string path, int line) Line = line; } } +} -{{GetEndpoints(endpoints)}} +namespace System.Runtime.CompilerServices +{ + {{GeneratedCodeAttribute}} + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute + { + public InterceptsLocationAttribute(string filePath, int line, int column) + { + } + } } namespace Microsoft.AspNetCore.Http.Generated @@ -532,6 +542,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; @@ -554,8 +565,29 @@ namespace Microsoft.AspNetCore.Http.Generated {{GeneratedCodeAttribute}} file static class GeneratedRouteBuilderExtensionsCore { -{{GetGenericThunks(genericThunks)}} -{{GetThunks(thunks)}} + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + {{endpoints}} + + internal static RouteHandlerBuilder MapCore( + this IEndpointRouteBuilder routes, + string pattern, + Delegate handler, + IEnumerable? httpMethods, + MetadataPopulator populateMetadata, + RequestDelegateFactoryFunc createRequestDelegate) + { + return RouteHandlerServices.Map(routes, pattern, handler, httpMethods, populateMetadata, createRequestDelegate); + } + + private static T Cast(Delegate d, T _) where T : Delegate + { + return (T)d; + } private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { @@ -600,63 +632,4 @@ private static Task ExecuteObjectResult(object? obj, HttpContext httpContext) {{LogOrThrowExceptionHelperClass}} } """; - private static string GetGenericThunks(string genericThunks) => genericThunks != string.Empty ? $$""" - private static class GenericThunks - { - public static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() - { - {{genericThunks}} - }; - } - - internal static RouteHandlerBuilder MapCore( - this IEndpointRouteBuilder routes, - string pattern, - Delegate handler, - IEnumerable httpMethods, - string filePath, - int lineNumber) - { - var (populateMetadata, createRequestDelegate) = GenericThunks.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? 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) => endpoints != string.Empty ? $$""" - // 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 }; - private static readonly string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - {{endpoints}} - } -""" : string.Empty; } diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterConstants.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EmitterConstants.cs similarity index 95% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterConstants.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EmitterConstants.cs index f609f825a44a..88fe875804dc 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterConstants.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EmitterConstants.cs @@ -1,18 +1,19 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.CodeAnalysis; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; + +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; internal static class EmitterConstants { public static SymbolDisplayFormat DisplayFormat => new SymbolDisplayFormat( - globalNamespaceStyle: SymbolDisplayGlobalNamespaceStyle.Included, + globalNamespaceStyle: SymbolDisplayGlobalNamespaceStyle.Omitted, genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters, typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces, miscellaneousOptions: SymbolDisplayMiscellaneousOptions.IncludeNullableReferenceTypeModifier); public static SymbolDisplayFormat DisplayFormatWithoutNullability => new SymbolDisplayFormat( - globalNamespaceStyle: SymbolDisplayGlobalNamespaceStyle.Included, + globalNamespaceStyle: SymbolDisplayGlobalNamespaceStyle.Omitted, genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters, typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces); } diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterContext.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EmitterContext.cs similarity index 96% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterContext.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EmitterContext.cs index 669df4470d4e..4957e0cc09c1 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterContext.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EmitterContext.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. -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; + +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; internal sealed class EmitterContext { diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterExtensions.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EmitterExtensions.cs similarity index 95% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterExtensions.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EmitterExtensions.cs index b17e0614f2a6..ea21fa082555 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterExtensions.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EmitterExtensions.cs @@ -3,9 +3,10 @@ using System; using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Analyzers.Infrastructure; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.CodeAnalysis; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; internal static class EmitterExtensions { diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EndpointEmitter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EndpointEmitter.cs new file mode 100644 index 000000000000..24112c375e49 --- /dev/null +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EndpointEmitter.cs @@ -0,0 +1,218 @@ +// 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 Microsoft.CodeAnalysis; +using System.Linq; +using System.Text; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; + +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; + +internal static class EndpointEmitter +{ + 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) ? "void ()" : $"{endpoint.Response.WrappedResponseType} ()"; + } + 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 $"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); + } + } + + public static string EmitSourceKey(this Endpoint endpoint) + { + return $@"(@""{endpoint.Location.File}"", {endpoint.Location.LineNumber})"; + } + + public static string EmitVerb(this Endpoint endpoint) + { + return endpoint.HttpMethod switch + { + "MapGet" => "GetVerb", + "MapPut" => "PutVerb", + "MapPost" => "PostVerb", + "MapDelete" => "DeleteVerb", + "MapPatch" => "PatchVerb", + "MapMethods" => "httpMethods", + "Map" => "null", + "MapFallback" => "null", + _ => throw new ArgumentException($"Received unexpected HTTP method: {endpoint.HttpMethod}") + }; + } + + /* + * Emit invocation to the request handler. The structure + * involved here consists of a call to bind parameters, check + * their validity (optionality), invoke the underlying handler with + * the arguments bound from HTTP context, and write out the response. + */ + public static void EmitRequestHandler(this Endpoint endpoint, CodeWriter codeWriter) + { + codeWriter.WriteLine(endpoint.IsAwaitable ? "async Task RequestHandler(HttpContext httpContext)" : "Task RequestHandler(HttpContext httpContext)"); + codeWriter.StartBlock(); // Start handler method block + codeWriter.WriteLine("var wasParamCheckFailure = false;"); + + if (endpoint.Parameters.Length > 0) + { + codeWriter.WriteLine(endpoint.Parameters.EmitParameterPreparation(endpoint.EmitterContext, codeWriter.Indent)); + } + + codeWriter.WriteLine("if (wasParamCheckFailure)"); + codeWriter.StartBlock(); // Start if-statement block + codeWriter.WriteLine("httpContext.Response.StatusCode = 400;"); + codeWriter.WriteLine(endpoint.IsAwaitable ? "return;" : "return Task.CompletedTask;"); + codeWriter.EndBlock(); // End if-statement block + if (endpoint.Response == null) + { + return; + } + if (!endpoint.Response.HasNoResponse) + { + codeWriter.Write("var result = "); + } + if (endpoint.Response.IsAwaitable) + { + codeWriter.Write("await "); + } + codeWriter.WriteLine($"handler({endpoint.EmitArgumentList()});"); + + endpoint.Response.EmitHttpResponseContentType(codeWriter); + + if (!endpoint.Response.HasNoResponse) + { + codeWriter.WriteLine(endpoint.Response.EmitResponseWritingCall(endpoint.IsAwaitable)); + } + else if (!endpoint.IsAwaitable) + { + codeWriter.WriteLine("return Task.CompletedTask;"); + } + codeWriter.EndBlock(); // End handler method block + } + + public static void EmitFilteredRequestHandler(this Endpoint endpoint, CodeWriter codeWriter) + { + var argumentList = endpoint.Parameters.Length == 0 ? string.Empty : $", {endpoint.EmitArgumentList()}"; + var invocationCreator = endpoint.Parameters.Length > 8 + ? "new DefaultEndpointFilterInvocationContext" + : "EndpointFilterInvocationContext.Create"; + var invocationGenericArgs = endpoint.Parameters.Length is > 0 and < 8 + ? $"<{endpoint.EmitFilterInvocationContextTypeArgs()}>" + : string.Empty; + + codeWriter.WriteLine("async Task RequestHandlerFiltered(HttpContext httpContext)"); + codeWriter.StartBlock(); // Start handler method block + codeWriter.WriteLine("var wasParamCheckFailure = false;"); + + if (endpoint.Parameters.Length > 0) + { + codeWriter.WriteLine(endpoint.Parameters.EmitParameterPreparation(endpoint.EmitterContext, codeWriter.Indent)); + } + + codeWriter.WriteLine("if (wasParamCheckFailure)"); + codeWriter.StartBlock(); // Start if-statement block + codeWriter.WriteLine("httpContext.Response.StatusCode = 400;"); + codeWriter.EndBlock(); // End if-statement block + codeWriter.WriteLine($"var result = await filteredInvocation({invocationCreator}{invocationGenericArgs}(httpContext{argumentList}));"); + codeWriter.WriteLine("await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext);"); + codeWriter.EndBlock(); // End handler method block + } + + public static void EmitEndpointMetadataPopulation(this Endpoint endpoint, CodeWriter codeWriter) + { + endpoint.EmitAcceptsMetadata(codeWriter); + endpoint.EmitBuiltinResponseTypeMetadata(codeWriter); + endpoint.EmitCallsToMetadataProvidersForParameters(codeWriter); + endpoint.EmitCallToMetadataProviderForResponse(codeWriter); + } + + public static void EmitFilteredInvocation(this Endpoint endpoint, CodeWriter codeWriter) + { + if (endpoint.Response?.HasNoResponse == true) + { + codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true + ? $"await handler({endpoint.EmitFilteredArgumentList()});" + : $"handler({endpoint.EmitFilteredArgumentList()});"); + codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true + ? "return (object?)Results.Empty;" + : "return ValueTask.FromResult(Results.Empty);"); + } + else if (endpoint.Response?.IsAwaitable == true) + { + codeWriter.WriteLine($"var result = await handler({endpoint.EmitFilteredArgumentList()});"); + codeWriter.WriteLine("return (object?)result;"); + } + else + { + codeWriter.WriteLine($"return ValueTask.FromResult(handler({endpoint.EmitFilteredArgumentList()}));"); + } + } + + private static string EmitFilteredArgumentList(this Endpoint endpoint) + { + if (endpoint.Parameters.Length == 0) + { + return string.Empty; + } + + var sb = new StringBuilder(); + + for (var i = 0; i < endpoint.Parameters.Length; i++) + { + // The null suppression operator on the GetArgument(...) call here is required because we'll occassionally be + // dealing with nullable types here. We could try to do fancy things to branch the logic here depending on + // the nullability, but at the end of the day we are going to call GetArguments(...) - at runtime the nullability + // suppression operator doesn't come into play - so its not worth worrying about. + sb.Append($"ic.GetArgument<{endpoint.Parameters[i].Type.ToDisplayString(EmitterConstants.DisplayFormat)}>({i})!"); + + if (i < endpoint.Parameters.Length - 1) + { + sb.Append(", "); + } + } + + return sb.ToString(); + } + + private static string EmitFilterInvocationContextTypeArgs(this Endpoint endpoint) + { + if (endpoint.Parameters.Length == 0) + { + return string.Empty; + } + + var sb = new StringBuilder(); + + for (var i = 0; i < endpoint.Parameters.Length; i++) + { + sb.Append(endpoint.Parameters[i].Type.ToDisplayString(endpoint.Parameters[i].IsOptional ? NullableFlowState.MaybeNull : NullableFlowState.NotNull, EmitterConstants.DisplayFormat)); + + if (i < endpoint.Parameters.Length - 1) + { + sb.Append(", "); + } + } + + return sb.ToString(); + } + + private static string EmitArgumentList(this Endpoint endpoint) => string.Join(", ", endpoint.Parameters.Select(p => p.EmitArgument())); +} diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointParameterEmitter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EndpointParameterEmitter.cs similarity index 60% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointParameterEmitter.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EndpointParameterEmitter.cs index 8eec1bda9909..e491cc36cb01 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointParameterEmitter.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EndpointParameterEmitter.cs @@ -2,19 +2,147 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; using Microsoft.AspNetCore.Analyzers.Infrastructure; using Microsoft.AspNetCore.Analyzers.RouteEmbeddedLanguage.Infrastructure; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; internal static class EndpointParameterEmitter { - internal static void EmitSpecialParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) + /* + * Iterates through all of the provided parameters + * in a given endpoint and invokes the appropriate + * emission sub-function based on the parameter type. + */ + public static string EmitParameterPreparation(this IEnumerable endpointParameters, EmitterContext emitterContext, int baseIndent = 0) + { + using var stringWriter = new StringWriter(CultureInfo.InvariantCulture); + using var parameterPreparationBuilder = new CodeWriter(stringWriter, baseIndent); + var readFormEmitted = false; + + foreach (var parameter in endpointParameters) + { + switch (parameter.Source) + { + case EndpointParameterSource.SpecialType: + parameter.EmitSpecialParameterPreparation(parameterPreparationBuilder); + break; + case EndpointParameterSource.Query: + case EndpointParameterSource.Header: + parameter.EmitQueryOrHeaderParameterPreparation(parameterPreparationBuilder); + break; + case EndpointParameterSource.Route: + parameter.EmitRouteParameterPreparation(parameterPreparationBuilder); + break; + case EndpointParameterSource.RouteOrQuery: + emitterContext.HasRouteOrQuery = true; + parameter.EmitRouteOrQueryParameterPreparation(parameterPreparationBuilder); + break; + case EndpointParameterSource.BindAsync: + emitterContext.HasBindAsync = true; + parameter.EmitBindAsyncPreparation(parameterPreparationBuilder); + break; + case EndpointParameterSource.JsonBody: + parameter.EmitJsonBodyParameterPreparationString(parameterPreparationBuilder); + break; + case EndpointParameterSource.FormBody: + parameter.EmitFormParameterPreparation(parameterPreparationBuilder, ref readFormEmitted); + break; + case EndpointParameterSource.JsonBodyOrService: + parameter.EmitJsonBodyOrServiceParameterPreparationString(parameterPreparationBuilder); + break; + case EndpointParameterSource.JsonBodyOrQuery: + parameter.EmitJsonBodyOrQueryParameterPreparationString(parameterPreparationBuilder); + break; + case EndpointParameterSource.Service: + parameter.EmitServiceParameterPreparation(parameterPreparationBuilder); + break; + case EndpointParameterSource.AsParameters: + parameter.EmitAsParametersParameterPreparation(parameterPreparationBuilder, emitterContext); + break; + } + } + + return stringWriter.ToString(); + } + + /* + * Emits resolvers that are invoked once at startup + * for initializing how parameters that are ambiguous + * at compile-time should be resolved. + */ + public static void EmitRouteOrQueryResolver(this Endpoint endpoint, CodeWriter codeWriter) + { + foreach (var parameter in endpoint.Parameters) + { + ProcessParameter(parameter, codeWriter, endpoint); + if (parameter is { Source: EndpointParameterSource.AsParameters, EndpointParameters: {} innerParameters }) + { + foreach (var innerParameter in innerParameters) + { + ProcessParameter(innerParameter, codeWriter, endpoint); + } + } + } + + static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter, Endpoint endpoint) + { + if (parameter.Source == EndpointParameterSource.RouteOrQuery) + { + var parameterName = parameter.SymbolName; + codeWriter.Write($@"var {parameterName}_RouteOrQueryResolver = "); + codeWriter.WriteLine($@"GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery(""{parameterName}"", options?.RouteParameterNames);"); + endpoint.EmitterContext.HasRouteOrQuery = true; + } + } + } + + public static void EmitJsonBodyOrServiceResolver(this Endpoint endpoint, CodeWriter codeWriter) + { + var serviceProviderEmitted = false; + foreach (var parameter in endpoint.Parameters) + { + ProcessParameter(parameter, codeWriter, ref serviceProviderEmitted); + if (parameter is { Source: EndpointParameterSource.AsParameters, EndpointParameters: {} innerParameters }) + { + foreach (var innerParameter in innerParameters) + { + ProcessParameter(innerParameter, codeWriter, ref serviceProviderEmitted); + } + } + } + + static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter, ref bool serviceProviderEmitted) + { + if (parameter.Source == EndpointParameterSource.JsonBodyOrService) + { + if (!serviceProviderEmitted) + { + codeWriter.WriteLine("var serviceProviderIsService = serviceProvider?.GetService();"); + serviceProviderEmitted = true; + } + codeWriter.Write($@"var {parameter.SymbolName}_JsonBodyOrServiceResolver = "); + var shortParameterTypeName = parameter.Type.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat); + codeWriter.WriteLine($"ResolveJsonBodyOrService<{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(logOrThrowExceptionHelper, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(parameter.SymbolName, true)}, serviceProviderIsService);"); + } + } + } + + /* + * Emits parameter preparation for a parameter + * of a given source. + */ + private static void EmitSpecialParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) => codeWriter.WriteLine($"var {endpointParameter.EmitHandlerArgument()} = {endpointParameter.AssigningCode};"); - internal static void EmitQueryOrHeaderParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) + private static void EmitQueryOrHeaderParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) { codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment()); @@ -52,7 +180,7 @@ internal static void EmitQueryOrHeaderParameterPreparation(this EndpointParamete endpointParameter.EmitParsingBlock(codeWriter); } - internal static void EmitFormParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter, ref bool readFormEmitted) + private static void EmitFormParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter, ref bool readFormEmitted) { codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment()); @@ -87,7 +215,7 @@ internal static void EmitFormParameterPreparation(this EndpointParameter endpoin endpointParameter.EmitParsingBlock(codeWriter); } - internal static void EmitParsingBlock(this EndpointParameter endpointParameter, CodeWriter codeWriter) + private static void EmitParsingBlock(this EndpointParameter endpointParameter, CodeWriter codeWriter) { if (endpointParameter.IsArray && endpointParameter.IsParsable) { @@ -124,7 +252,7 @@ internal static void EmitParsingBlock(this EndpointParameter endpointParameter, } } - internal static void EmitRouteParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) + private static void EmitRouteParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) { codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment()); @@ -151,7 +279,7 @@ internal static void EmitRouteParameterPreparation(this EndpointParameter endpoi endpointParameter.EmitParsingBlock(codeWriter); } - internal static void EmitRouteOrQueryParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) + private static void EmitRouteOrQueryParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) { codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment()); @@ -182,7 +310,7 @@ internal static void EmitRouteOrQueryParameterPreparation(this EndpointParameter endpointParameter.EmitParsingBlock(codeWriter); } - internal static void EmitJsonBodyParameterPreparationString(this EndpointParameter endpointParameter, CodeWriter codeWriter) + private static void EmitJsonBodyParameterPreparationString(this EndpointParameter endpointParameter, CodeWriter codeWriter) { // Preamble for diagnostics purposes. codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment()); @@ -204,7 +332,7 @@ internal static void EmitJsonBodyParameterPreparationString(this EndpointParamet codeWriter.EndBlock(); } - internal static void EmitJsonBodyOrServiceParameterPreparationString(this EndpointParameter endpointParameter, CodeWriter codeWriter) + private static void EmitJsonBodyOrServiceParameterPreparationString(this EndpointParameter endpointParameter, CodeWriter codeWriter) { // Preamble for diagnostics purposes. codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment()); @@ -225,7 +353,7 @@ internal static void EmitJsonBodyOrServiceParameterPreparationString(this Endpoi codeWriter.EndBlock(); } - internal static void EmitJsonBodyOrQueryParameterPreparationString(this EndpointParameter endpointParameter, CodeWriter codeWriter) + private static void EmitJsonBodyOrQueryParameterPreparationString(this EndpointParameter endpointParameter, CodeWriter codeWriter) { // Preamble for diagnostics purposes. codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment()); @@ -260,7 +388,7 @@ internal static void EmitJsonBodyOrQueryParameterPreparationString(this Endpoint codeWriter.EndBlock(); } - internal static void EmitBindAsyncPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) + private static void EmitBindAsyncPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) { // Invoke the `BindAsync` method on an interface if it is the target receiver. var receiverType = endpointParameter.BindableMethodSymbol?.ReceiverType is { TypeKind: TypeKind.Interface } targetType @@ -312,7 +440,7 @@ internal static void EmitBindAsyncPreparation(this EndpointParameter endpointPar } } - internal static void EmitServiceParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) + private static void EmitServiceParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter) { codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment()); @@ -326,17 +454,156 @@ internal static void EmitServiceParameterPreparation(this EndpointParameter endp codeWriter.WriteLine($"var {endpointParameter.EmitHandlerArgument()} = {assigningCode};"); } - internal static void EmitAsParametersParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter, EmitterContext emitterContext) + private static void EmitAsParametersParameterPreparation(this EndpointParameter endpointParameter, CodeWriter codeWriter, EmitterContext emitterContext) { codeWriter.WriteLine(endpointParameter.EmitParameterDiagnosticComment()); codeWriter.WriteLine(endpointParameter.EndpointParameters?.EmitParameterPreparation(baseIndent: codeWriter.Indent, emitterContext: emitterContext)); codeWriter.WriteLine($"var {endpointParameter.EmitHandlerArgument()} = {endpointParameter.AssigningCode};"); } + /* + * Emitters for metadata-related aspects of parameters, such as invoking + * IEndpointParameterMetadataProviders, annotating metadata for form + * and JSON content types, and so on. + */ + public static void EmitCallsToMetadataProvidersForParameters(this Endpoint endpoint, CodeWriter codeWriter) + { + if (endpoint.EmitterContext.HasEndpointParameterMetadataProvider) + { + codeWriter.WriteLine("var parameterInfos = methodInfo.GetParameters();"); + } + + foreach (var parameter in endpoint.Parameters) + { + if (parameter is { Source: EndpointParameterSource.AsParameters, EndpointParameters: { } innerParameters }) + { + foreach (var innerParameter in innerParameters) + { + ProcessParameter(innerParameter, codeWriter); + } + } + else + { + ProcessParameter(parameter, codeWriter); + } + } + + static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter) + { + if (parameter.Type is not { } parameterType) + { + return; + } + + if (parameter.IsEndpointParameterMetadataProvider) + { + var resolveParameterInfo = parameter.IsProperty + ? parameter.PropertyAsParameterInfoConstruction + : $"parameterInfos[{parameter.Ordinal}]"; + codeWriter.WriteLine($"var {parameter.SymbolName}_ParameterInfo = {resolveParameterInfo};"); + codeWriter.WriteLine($"PopulateMetadataForParameter<{parameterType.ToDisplayString(EmitterConstants.DisplayFormat)}>({parameter.SymbolName}_ParameterInfo, options.EndpointBuilder);"); + } + + if (parameter.IsEndpointMetadataProvider) + { + codeWriter.WriteLine($"PopulateMetadataForEndpoint<{parameterType.ToDisplayString(EmitterConstants.DisplayFormat)}>(methodInfo, options.EndpointBuilder);"); + } + + } + } + + private static void EmitFormAcceptsMetadata(this Endpoint endpoint, CodeWriter codeWriter) + { + var hasFormFiles = endpoint.Parameters.Any(p => p.IsFormFile); + + if (hasFormFiles) + { + codeWriter.WriteLine("options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(contentTypes: GeneratedMetadataConstants.FormFileContentType));"); + } + else + { + codeWriter.WriteLine("options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(contentTypes: GeneratedMetadataConstants.FormContentType));"); + } + } + + private static void EmitJsonAcceptsMetadata(this Endpoint endpoint, CodeWriter codeWriter) + { + EndpointParameter? explicitBodyParameter = null; + var potentialImplicitBodyParameters = new List(); + + foreach (var parameter in endpoint.Parameters) + { + if (explicitBodyParameter == null && parameter.Source == EndpointParameterSource.JsonBody) + { + explicitBodyParameter = parameter; + break; + } + else if (parameter.Source == EndpointParameterSource.JsonBodyOrService) + { + potentialImplicitBodyParameters.Add(parameter); + } + } + + if (explicitBodyParameter != null) + { + codeWriter.WriteLine($$"""options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: typeof({{explicitBodyParameter.Type.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}}), isOptional: {{(explicitBodyParameter.IsOptional ? "true" : "false")}}, contentTypes: GeneratedMetadataConstants.JsonContentType));"""); + } + else if (potentialImplicitBodyParameters.Count > 0) + { + codeWriter.WriteLine("var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;"); + codeWriter.WriteLine($"var serviceProviderIsService = serviceProvider.GetRequiredService();"); + + codeWriter.WriteLine("var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {"); + codeWriter.Indent++; + foreach (var parameter in potentialImplicitBodyParameters) + { + codeWriter.WriteLine($$"""({{(parameter.IsOptional ? "true" : "false")}}, typeof({{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}})),"""); + } + codeWriter.Indent--; + codeWriter.WriteLine("};"); + codeWriter.WriteLine("foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)"); + codeWriter.StartBlock(); + codeWriter.WriteLine("if (!serviceProviderIsService.IsService(type))"); + codeWriter.StartBlock(); + codeWriter.WriteLine("options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));"); + codeWriter.WriteLine("break;"); + codeWriter.EndBlock(); + codeWriter.EndBlock(); + } + else + { + codeWriter.WriteLine($"options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType));"); + } + } + + public static void EmitAcceptsMetadata(this Endpoint endpoint, CodeWriter codeWriter) + { + var hasJsonBody = endpoint.EmitterContext.HasJsonBody || endpoint.EmitterContext.HasJsonBodyOrService; + + if (endpoint.EmitterContext.HasFormBody) + { + endpoint.EmitFormAcceptsMetadata(codeWriter); + } + else if (hasJsonBody) + { + endpoint.EmitJsonAcceptsMetadata(codeWriter); + } + } + + /* + * Helpers that are used for parameter preparation code. + */ private static string EmitParameterDiagnosticComment(this EndpointParameter endpointParameter) => $"// Endpoint Parameter: {endpointParameter.SymbolName} (Type = {endpointParameter.Type}, IsOptional = {endpointParameter.IsOptional}, IsParsable = {endpointParameter.IsParsable}, IsArray = {endpointParameter.IsArray}, Source = {endpointParameter.Source})"; private static string EmitTempArgument(this EndpointParameter endpointParameter) => $"{endpointParameter.SymbolName}_temp"; private static string EmitParsedTempArgument(this EndpointParameter endpointParameter) => $"{endpointParameter.SymbolName}_parsed_temp"; private static string EmitAssigningCodeResult(this EndpointParameter endpointParameter) => $"{endpointParameter.SymbolName}_raw"; + public static void EmitLoggingPreamble(this Endpoint endpoint, CodeWriter codeWriter) + { + if (endpoint.EmitterContext.RequiresLoggingHelper) + { + codeWriter.WriteLine("var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);"); + } + } } diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EndpointResponseEmitter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EndpointResponseEmitter.cs new file mode 100644 index 000000000000..a635b150c723 --- /dev/null +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Emitters/EndpointResponseEmitter.cs @@ -0,0 +1,109 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; +using Microsoft.CodeAnalysis; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; + +internal static class EndpointResponseEmitter +{ + internal static void EmitJsonPreparation(this EndpointResponse endpointResponse, CodeWriter codeWriter) + { + if (endpointResponse.IsSerializableJsonResponse(out var responseType)) + { + var typeName = responseType.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability); + + codeWriter.WriteLine("var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions;"); + codeWriter.WriteLine($"var jsonTypeInfo = (JsonTypeInfo<{typeName}>)serializerOptions.GetTypeInfo(typeof({typeName}));"); + } + } + + private static string EmitJsonResponse(this EndpointResponse endpointResponse) + { + if (endpointResponse.ResponseType != null && + (endpointResponse.ResponseType.IsSealed || endpointResponse.ResponseType.IsValueType)) + { + return $"httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo);"; + } + return $"GeneratedRouteBuilderExtensionsCore.WriteToResponseAsync(result, httpContext, jsonTypeInfo);"; + } + + internal static string EmitResponseWritingCall(this EndpointResponse endpointResponse, bool isAwaitable) + { + var returnOrAwait = isAwaitable ? "await" : "return"; + + if (endpointResponse.IsIResult) + { + return $"{returnOrAwait} GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext);"; + } + if (endpointResponse.ResponseType?.SpecialType == SpecialType.System_String) + { + return $"{returnOrAwait} httpContext.Response.WriteAsync(result);"; + } + if (endpointResponse.ResponseType?.SpecialType == SpecialType.System_Object) + { + return $"{returnOrAwait} GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext);"; + } + if (!endpointResponse.HasNoResponse) + { + return $"{returnOrAwait} {endpointResponse.EmitJsonResponse()}"; + } + if (!endpointResponse.IsAwaitable && endpointResponse.HasNoResponse) + { + return $"{returnOrAwait} Task.CompletedTask;"; + } + return $"{returnOrAwait} httpContext.Response.WriteAsync(result);"; + } + + internal static void EmitBuiltinResponseTypeMetadata(this Endpoint endpoint, CodeWriter codeWriter) + { + if (endpoint.Response is not { } response || response.ResponseType is not { } responseType) + { + return; + } + + if (response.HasNoResponse || response.IsIResult) + { + return; + } + + if (responseType.SpecialType == SpecialType.System_String) + { + codeWriter.WriteLine("options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));"); + } + else + { + codeWriter.WriteLine($"options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof({responseType.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType));"); + } + } + + internal static void EmitCallToMetadataProviderForResponse(this Endpoint endpoint, CodeWriter codeWriter) + { + if (endpoint.Response is not { } response || response.ResponseType is not { } responseType) + { + return; + } + + if (response.IsEndpointMetadataProvider) + { + codeWriter.WriteLine($"PopulateMetadataForEndpoint<{responseType.ToDisplayString(EmitterConstants.DisplayFormat)}>(methodInfo, options.EndpointBuilder);"); + } + } + + internal static void EmitHttpResponseContentType(this EndpointResponse endpointResponse, CodeWriter codeWriter) + { + if (!endpointResponse.HasNoResponse + && endpointResponse.ResponseType is { } responseType + && (responseType.SpecialType == SpecialType.System_Object || responseType.SpecialType == SpecialType.System_String)) + { + codeWriter.WriteLine("if (result is string)"); + codeWriter.StartBlock(); + codeWriter.WriteLine($@"httpContext.Response.ContentType ??= ""text/plain; charset=utf-8"";"); + codeWriter.EndBlock(); + codeWriter.WriteLine("else"); + codeWriter.StartBlock(); + codeWriter.WriteLine($@"httpContext.Response.ContentType ??= ""application/json; charset=utf-8"";"); + codeWriter.EndBlock(); + } + } +} diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Model/ConstructorParameter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/ConstructorParameter.cs similarity index 93% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Model/ConstructorParameter.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Model/ConstructorParameter.cs index 82fee4e2020f..6c1ec5b48b08 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Model/ConstructorParameter.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/ConstructorParameter.cs @@ -2,6 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.CodeAnalysis; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; internal record ConstructorParameter(IPropertySymbol Property, IParameterSymbol? Parameter); diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Endpoint.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/Endpoint.cs similarity index 91% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Endpoint.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Model/Endpoint.cs index b9e2890ecd3a..83ca28231a57 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Endpoint.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/Endpoint.cs @@ -6,12 +6,12 @@ using System.Linq; using Microsoft.AspNetCore.Analyzers.Infrastructure; using Microsoft.AspNetCore.App.Analyzers.Infrastructure; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Operations; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; internal class Endpoint { @@ -90,13 +90,12 @@ public Endpoint(IInvocationOperation operation, WellKnownTypes wellKnownTypes, S public string HttpMethod { get; } public bool IsAwaitable { get; set; } public bool NeedsParameterArray { get; } - public string? RoutePattern { get; } public EmitterContext EmitterContext { get; } public EndpointResponse? Response { get; } public EndpointParameter[] Parameters { get; } = Array.Empty(); public List Diagnostics { get; } = new List(); - 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) => @@ -139,13 +138,16 @@ public static int GetSignatureHashCode(Endpoint 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 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) diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointDelegateComparer.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointDelegateComparer.cs similarity index 96% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointDelegateComparer.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointDelegateComparer.cs index c960a870613f..5cbdf81d326c 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointDelegateComparer.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointDelegateComparer.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; internal sealed class EndpointDelegateComparer : IEqualityComparer { diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointParameter.cs similarity index 99% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointParameter.cs index bd2aee82f3b1..2bf24982502e 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointParameter.cs @@ -10,12 +10,12 @@ using Microsoft.AspNetCore.Analyzers.Infrastructure; using Microsoft.AspNetCore.Analyzers.RouteEmbeddedLanguage.Infrastructure; using Microsoft.AspNetCore.App.Analyzers.Infrastructure; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using WellKnownType = Microsoft.AspNetCore.App.Analyzers.Infrastructure.WellKnownTypeData.WellKnownType; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; internal class EndpointParameter { @@ -23,6 +23,7 @@ public EndpointParameter(Endpoint endpoint, IParameterSymbol parameter, WellKnow { Ordinal = parameter.Ordinal; IsOptional = parameter.IsOptional(); + HasDefaultValue = parameter.HasExplicitDefaultValue; DefaultValue = parameter.GetDefaultValueString(); ProcessEndpointParameterSource(endpoint, parameter, parameter.GetAttributes(), wellKnownTypes); } @@ -32,6 +33,7 @@ private EndpointParameter(Endpoint endpoint, IPropertySymbol property, IParamete 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(); @@ -251,6 +253,7 @@ private static bool ImplementsIEndpointParameterMetadataProvider(ITypeSymbol typ 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; } diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameterSource.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointParameterSource.cs similarity index 97% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameterSource.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointParameterSource.cs index d8410775a278..18593f75e67e 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameterSource.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointParameterSource.cs @@ -1,7 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; internal enum EndpointParameterSource { diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointResponse.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointResponse.cs similarity index 99% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointResponse.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointResponse.cs index ec99758412a6..eb489c68e149 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointResponse.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/EndpointResponse.cs @@ -4,10 +4,10 @@ using System; using Microsoft.AspNetCore.Analyzers.RouteEmbeddedLanguage.Infrastructure; using Microsoft.AspNetCore.App.Analyzers.Infrastructure; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Emitters; using Microsoft.CodeAnalysis; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using WellKnownType = WellKnownTypeData.WellKnownType; diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/InvocationOperationExtensions.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/InvocationOperationExtensions.cs similarity index 99% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/InvocationOperationExtensions.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Model/InvocationOperationExtensions.cs index 8907d10c778d..b5b9af44b6b9 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/InvocationOperationExtensions.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/InvocationOperationExtensions.cs @@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Operations; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; internal static class InvocationOperationExtensions { diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Model/ParameterLookupKey.cs b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/ParameterLookupKey.cs similarity index 97% rename from src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Model/ParameterLookupKey.cs rename to src/Http/Http.Extensions/gen/StaticRouteHandler/Model/ParameterLookupKey.cs index 55da4a664165..7615bc0863a4 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Model/ParameterLookupKey.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandler/Model/ParameterLookupKey.cs @@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis; using Microsoft.CodeAnalysis; -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; internal sealed class ParameterLookupKey { diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointEmitter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointEmitter.cs deleted file mode 100644 index b4e311b86ee4..000000000000 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointEmitter.cs +++ /dev/null @@ -1,132 +0,0 @@ -// 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.Generic; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using System.Globalization; -using System.IO; -using System.Linq; - -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; -internal static class EndpointEmitter -{ - internal static string EmitParameterPreparation(this IEnumerable endpointParameters, EmitterContext emitterContext, int baseIndent = 0) - { - using var stringWriter = new StringWriter(CultureInfo.InvariantCulture); - using var parameterPreparationBuilder = new CodeWriter(stringWriter, baseIndent); - var readFormEmitted = false; - - foreach (var parameter in endpointParameters) - { - switch (parameter.Source) - { - case EndpointParameterSource.SpecialType: - parameter.EmitSpecialParameterPreparation(parameterPreparationBuilder); - break; - case EndpointParameterSource.Query: - case EndpointParameterSource.Header: - parameter.EmitQueryOrHeaderParameterPreparation(parameterPreparationBuilder); - break; - case EndpointParameterSource.Route: - parameter.EmitRouteParameterPreparation(parameterPreparationBuilder); - break; - case EndpointParameterSource.RouteOrQuery: - emitterContext.HasRouteOrQuery = true; - parameter.EmitRouteOrQueryParameterPreparation(parameterPreparationBuilder); - break; - case EndpointParameterSource.BindAsync: - emitterContext.HasBindAsync = true; - parameter.EmitBindAsyncPreparation(parameterPreparationBuilder); - break; - case EndpointParameterSource.JsonBody: - parameter.EmitJsonBodyParameterPreparationString(parameterPreparationBuilder); - break; - case EndpointParameterSource.FormBody: - parameter.EmitFormParameterPreparation(parameterPreparationBuilder, ref readFormEmitted); - break; - case EndpointParameterSource.JsonBodyOrService: - parameter.EmitJsonBodyOrServiceParameterPreparationString(parameterPreparationBuilder); - break; - case EndpointParameterSource.JsonBodyOrQuery: - parameter.EmitJsonBodyOrQueryParameterPreparationString(parameterPreparationBuilder); - break; - case EndpointParameterSource.Service: - parameter.EmitServiceParameterPreparation(parameterPreparationBuilder); - break; - case EndpointParameterSource.AsParameters: - parameter.EmitAsParametersParameterPreparation(parameterPreparationBuilder, emitterContext); - break; - } - } - - return stringWriter.ToString(); - } - - public static void EmitRouteOrQueryResolver(this Endpoint endpoint, CodeWriter codeWriter) - { - foreach (var parameter in endpoint.Parameters) - { - ProcessParameter(parameter, codeWriter, endpoint); - if (parameter is { Source: EndpointParameterSource.AsParameters, EndpointParameters: {} innerParameters }) - { - foreach (var innerParameter in innerParameters) - { - ProcessParameter(innerParameter, codeWriter, endpoint); - } - } - } - - static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter, Endpoint endpoint) - { - if (parameter.Source == EndpointParameterSource.RouteOrQuery) - { - var parameterName = parameter.SymbolName; - codeWriter.Write($@"var {parameterName}_RouteOrQueryResolver = "); - codeWriter.WriteLine($@"GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery(""{parameterName}"", options.RouteParameterNames);"); - endpoint.EmitterContext.HasRouteOrQuery = true; - } - } - } - - public static void EmitJsonBodyOrServiceResolver(this Endpoint endpoint, CodeWriter codeWriter) - { - var serviceProviderEmitted = false; - foreach (var parameter in endpoint.Parameters) - { - ProcessParameter(parameter, codeWriter, ref serviceProviderEmitted); - if (parameter is { Source: EndpointParameterSource.AsParameters, EndpointParameters: {} innerParameters }) - { - foreach (var innerParameter in innerParameters) - { - ProcessParameter(innerParameter, codeWriter, ref serviceProviderEmitted); - } - } - } - - static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter, ref bool serviceProviderEmitted) - { - if (parameter.Source == EndpointParameterSource.JsonBodyOrService) - { - if (!serviceProviderEmitted) - { - codeWriter.WriteLine("var serviceProviderIsService = serviceProvider?.GetService();"); - serviceProviderEmitted = true; - } - codeWriter.Write($@"var {parameter.SymbolName}_JsonBodyOrServiceResolver = "); - var shortParameterTypeName = parameter.Type.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat); - codeWriter.WriteLine($"ResolveJsonBodyOrService<{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(logOrThrowExceptionHelper, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(parameter.SymbolName, true)}, serviceProviderIsService);"); - } - } - } - - public static void EmitLoggingPreamble(this Endpoint endpoint, CodeWriter codeWriter) - { - if (endpoint.EmitterContext.RequiresLoggingHelper) - { - codeWriter.WriteLine("var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);"); - } - } - - public static string EmitArgumentList(this Endpoint endpoint) => string.Join(", ", endpoint.Parameters.Select(p => p.EmitArgument())); -} diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointJsonResponseEmitter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointJsonResponseEmitter.cs deleted file mode 100644 index 0f542bc3cf5f..000000000000 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointJsonResponseEmitter.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; - -internal static class EndpointJsonResponseEmitter -{ - internal static void EmitJsonPreparation(this EndpointResponse endpointResponse, CodeWriter codeWriter) - { - if (endpointResponse.IsSerializableJsonResponse(out var responseType)) - { - var typeName = responseType.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability); - - codeWriter.WriteLine("var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions;"); - codeWriter.WriteLine($"var jsonTypeInfo = (JsonTypeInfo<{typeName}>)serializerOptions.GetTypeInfo(typeof({typeName}));"); - } - } - - internal static string EmitJsonResponse(this EndpointResponse endpointResponse) - { - if (endpointResponse.ResponseType != null && - (endpointResponse.ResponseType.IsSealed || endpointResponse.ResponseType.IsValueType)) - { - return $"httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo);"; - } - return $"GeneratedRouteBuilderExtensionsCore.WriteToResponseAsync(result, httpContext, jsonTypeInfo);"; - } -} diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs deleted file mode 100644 index df0688d687be..000000000000 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs +++ /dev/null @@ -1,420 +0,0 @@ -// 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.Linq; -using System.Text; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel.Emitters; -using Microsoft.CodeAnalysis; - -namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; - -internal static class StaticRouteHandlerModelEmitter -{ - public static string EmitHandlerDelegateType(this Endpoint endpoint, bool considerOptionality = false) - { - if (endpoint.Parameters.Length == 0) - { - return endpoint.Response == null || (endpoint.Response.HasNoResponse && !endpoint.Response.IsAwaitable) ? "System.Action" : $"System.Func<{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))); - - if (endpoint.Response == null || (endpoint.Response.HasNoResponse && !endpoint.Response.IsAwaitable)) - { - return $"System.Action<{parameterTypeList}>"; - } - return $"System.Func<{parameterTypeList}, {endpoint.Response.WrappedResponseType}>"; - } - - public static string EmitSourceKey(this Endpoint endpoint) - { - return $@"(@""{endpoint.Location.File}"", {endpoint.Location.LineNumber})"; - } - - public static string EmitVerb(this Endpoint endpoint) - { - return endpoint.HttpMethod switch - { - "MapGet" => "GetVerb", - "MapPut" => "PutVerb", - "MapPost" => "PostVerb", - "MapDelete" => "DeleteVerb", - "MapPatch" => "PatchVerb", - "MapMethods" => "httpMethods", - "Map" => "null", - "MapFallback" => "null", - _ => throw new ArgumentException($"Received unexpected HTTP method: {endpoint.HttpMethod}") - }; - } - - /* - * Emit invocation to the request handler. The structure - * involved here consists of a call to bind parameters, check - * their validity (optionality), invoke the underlying handler with - * the arguments bound from HTTP context, and write out the response. - */ - public static void EmitRequestHandler(this Endpoint endpoint, CodeWriter codeWriter) - { - codeWriter.WriteLine(endpoint.IsAwaitable ? "async Task RequestHandler(HttpContext httpContext)" : "Task RequestHandler(HttpContext httpContext)"); - codeWriter.StartBlock(); // Start handler method block - codeWriter.WriteLine("var wasParamCheckFailure = false;"); - - if (endpoint.Parameters.Length > 0) - { - codeWriter.WriteLine(endpoint.Parameters.EmitParameterPreparation(endpoint.EmitterContext, codeWriter.Indent)); - } - - codeWriter.WriteLine("if (wasParamCheckFailure)"); - codeWriter.StartBlock(); // Start if-statement block - codeWriter.WriteLine("httpContext.Response.StatusCode = 400;"); - codeWriter.WriteLine(endpoint.IsAwaitable ? "return;" : "return Task.CompletedTask;"); - codeWriter.EndBlock(); // End if-statement block - if (endpoint.Response == null) - { - return; - } - if (!endpoint.Response.HasNoResponse) - { - codeWriter.Write("var result = "); - } - if (endpoint.Response.IsAwaitable) - { - codeWriter.Write("await "); - } - codeWriter.WriteLine($"handler({endpoint.EmitArgumentList()});"); - - endpoint.Response.EmitHttpResponseContentType(codeWriter); - - if (!endpoint.Response.HasNoResponse) - { - codeWriter.WriteLine(endpoint.Response.EmitResponseWritingCall(endpoint.IsAwaitable)); - } - else if (!endpoint.IsAwaitable) - { - codeWriter.WriteLine("return Task.CompletedTask;"); - } - - codeWriter.EndBlock(); // End handler method block - } - - private static void EmitHttpResponseContentType(this EndpointResponse endpointResponse, CodeWriter codeWriter) - { - if (!endpointResponse.HasNoResponse - && endpointResponse.ResponseType is { } responseType - && (responseType.SpecialType == SpecialType.System_Object || responseType.SpecialType == SpecialType.System_String)) - { - codeWriter.WriteLine("if (result is string)"); - codeWriter.StartBlock(); - codeWriter.WriteLine($@"httpContext.Response.ContentType ??= ""text/plain; charset=utf-8"";"); - codeWriter.EndBlock(); - codeWriter.WriteLine("else"); - codeWriter.StartBlock(); - codeWriter.WriteLine($@"httpContext.Response.ContentType ??= ""application/json; charset=utf-8"";"); - codeWriter.EndBlock(); - } - } - - private static string EmitResponseWritingCall(this EndpointResponse endpointResponse, bool isAwaitable) - { - var returnOrAwait = isAwaitable ? "await" : "return"; - - if (endpointResponse.IsIResult) - { - return $"{returnOrAwait} GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext);"; - } - else if (endpointResponse.ResponseType?.SpecialType == SpecialType.System_String) - { - return $"{returnOrAwait} httpContext.Response.WriteAsync(result);"; - } - else if (endpointResponse.ResponseType?.SpecialType == SpecialType.System_Object) - { - return $"{returnOrAwait} GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext);"; - } - else if (!endpointResponse.HasNoResponse) - { - return $"{returnOrAwait} {endpointResponse.EmitJsonResponse()}"; - } - else if (!endpointResponse.IsAwaitable && endpointResponse.HasNoResponse) - { - return $"{returnOrAwait} Task.CompletedTask;"; - } - else - { - return $"{returnOrAwait} httpContext.Response.WriteAsync(result);"; - } - } - - /* - * TODO: Emit invocation to the `filteredInvocation` pipeline by constructing - * the `EndpointFilterInvocationContext` using the bound arguments for the handler. - * In the source generator context, the generic overloads for `EndpointFilterInvocationContext` - * can be used to reduce the boxing that happens at runtime when constructing - * the context object. - */ - public static void EmitFilteredRequestHandler(this Endpoint endpoint, CodeWriter codeWriter) - { - var argumentList = endpoint.Parameters.Length == 0 ? string.Empty : $", {endpoint.EmitArgumentList()}"; - var invocationCreator = endpoint.Parameters.Length > 8 - ? "new DefaultEndpointFilterInvocationContext" - : "EndpointFilterInvocationContext.Create"; - var invocationGenericArgs = endpoint.Parameters.Length is > 0 and < 8 - ? $"<{endpoint.EmitFilterInvocationContextTypeArgs()}>" - : string.Empty; - - codeWriter.WriteLine("async Task RequestHandlerFiltered(HttpContext httpContext)"); - codeWriter.StartBlock(); // Start handler method block - codeWriter.WriteLine("var wasParamCheckFailure = false;"); - - if (endpoint.Parameters.Length > 0) - { - codeWriter.WriteLine(endpoint.Parameters.EmitParameterPreparation(endpoint.EmitterContext, codeWriter.Indent)); - } - - codeWriter.WriteLine("if (wasParamCheckFailure)"); - codeWriter.StartBlock(); // Start if-statement block - codeWriter.WriteLine("httpContext.Response.StatusCode = 400;"); - codeWriter.EndBlock(); // End if-statement block - codeWriter.WriteLine($"var result = await filteredInvocation({invocationCreator}{invocationGenericArgs}(httpContext{argumentList}));"); - codeWriter.WriteLine("await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext);"); - codeWriter.EndBlock(); // End handler method block - } - - private static void EmitBuiltinResponseTypeMetadata(this Endpoint endpoint, CodeWriter codeWriter) - { - if (endpoint.Response is not { } response || response.ResponseType is not { } responseType) - { - return; - } - - if (response.HasNoResponse || response.IsIResult) - { - return; - } - - if (responseType.SpecialType == SpecialType.System_String) - { - codeWriter.WriteLine("options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType));"); - } - else - { - codeWriter.WriteLine($"options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof({responseType.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType));"); - } - } - - private static void EmitCallToMetadataProviderForResponse(this Endpoint endpoint, CodeWriter codeWriter) - { - if (endpoint.Response is not { } response || response.ResponseType is not { } responseType) - { - return; - } - - if (response.IsEndpointMetadataProvider) - { - codeWriter.WriteLine($"PopulateMetadataForEndpoint<{responseType.ToDisplayString(EmitterConstants.DisplayFormat)}>(methodInfo, options.EndpointBuilder);"); - } - } - private static void EmitCallsToMetadataProvidersForParameters(this Endpoint endpoint, CodeWriter codeWriter) - { - if (endpoint.EmitterContext.HasEndpointParameterMetadataProvider) - { - codeWriter.WriteLine("var parameterInfos = methodInfo.GetParameters();"); - } - - foreach (var parameter in endpoint.Parameters) - { - if (parameter is { Source: EndpointParameterSource.AsParameters, EndpointParameters: { } innerParameters }) - { - foreach (var innerParameter in innerParameters) - { - ProcessParameter(innerParameter, codeWriter); - } - } - else - { - ProcessParameter(parameter, codeWriter); - } - } - - static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter) - { - if (parameter.Type is not { } parameterType) - { - return; - } - - if (parameter.IsEndpointParameterMetadataProvider) - { - var resolveParameterInfo = parameter.IsProperty - ? parameter.PropertyAsParameterInfoConstruction - : $"parameterInfos[{parameter.Ordinal}]"; - codeWriter.WriteLine($"var {parameter.SymbolName}_ParameterInfo = {resolveParameterInfo};"); - codeWriter.WriteLine($"PopulateMetadataForParameter<{parameterType.ToDisplayString(EmitterConstants.DisplayFormat)}>({parameter.SymbolName}_ParameterInfo, options.EndpointBuilder);"); - } - - if (parameter.IsEndpointMetadataProvider) - { - codeWriter.WriteLine($"PopulateMetadataForEndpoint<{parameterType.ToDisplayString(EmitterConstants.DisplayFormat)}>(methodInfo, options.EndpointBuilder);"); - } - - } - } - - public static void EmitFormAcceptsMetadata(this Endpoint endpoint, CodeWriter codeWriter) - { - var hasFormFiles = endpoint.Parameters.Any(p => p.IsFormFile); - - if (hasFormFiles) - { - codeWriter.WriteLine("options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(contentTypes: GeneratedMetadataConstants.FormFileContentType));"); - } - else - { - codeWriter.WriteLine("options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(contentTypes: GeneratedMetadataConstants.FormContentType));"); - } - } - - public static void EmitJsonAcceptsMetadata(this Endpoint endpoint, CodeWriter codeWriter) - { - EndpointParameter? explicitBodyParameter = null; - var potentialImplicitBodyParameters = new List(); - - foreach (var parameter in endpoint.Parameters) - { - if (explicitBodyParameter == null && parameter.Source == EndpointParameterSource.JsonBody) - { - explicitBodyParameter = parameter; - break; - } - else if (parameter.Source == EndpointParameterSource.JsonBodyOrService || parameter.Source == EndpointParameterSource.JsonBodyOrQuery) - { - potentialImplicitBodyParameters.Add(parameter); - } - } - - if (explicitBodyParameter != null) - { - codeWriter.WriteLine($$"""options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: typeof({{explicitBodyParameter.Type.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}}), isOptional: {{(explicitBodyParameter.IsOptional ? "true" : "false")}}, contentTypes: GeneratedMetadataConstants.JsonContentType));"""); - } - else if (potentialImplicitBodyParameters.Count > 0) - { - codeWriter.WriteLine("var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;"); - codeWriter.WriteLine($"var serviceProviderIsService = serviceProvider.GetRequiredService();"); - - codeWriter.WriteLine("var jsonBodyOrServiceTypeTuples = new (bool, Type)[] {"); - codeWriter.Indent++; - foreach (var parameter in potentialImplicitBodyParameters) - { - codeWriter.WriteLine($$"""({{(parameter.IsOptional ? "true" : "false")}}, typeof({{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}})),"""); - } - codeWriter.Indent--; - codeWriter.WriteLine("};"); - codeWriter.WriteLine("foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples)"); - codeWriter.StartBlock(); - codeWriter.WriteLine("if (!serviceProviderIsService.IsService(type))"); - codeWriter.StartBlock(); - codeWriter.WriteLine("options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType));"); - codeWriter.WriteLine("break;"); - codeWriter.EndBlock(); - codeWriter.EndBlock(); - } - else - { - codeWriter.WriteLine($"options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType));"); - } - } - - public static void EmitAcceptsMetadata(this Endpoint endpoint, CodeWriter codeWriter) - { - var hasJsonBody = endpoint.EmitterContext.HasJsonBody || endpoint.EmitterContext.HasJsonBodyOrService || endpoint.EmitterContext.HasJsonBodyOrQuery; - - if (endpoint.EmitterContext.HasFormBody) - { - endpoint.EmitFormAcceptsMetadata(codeWriter); - } - else if (hasJsonBody) - { - endpoint.EmitJsonAcceptsMetadata(codeWriter); - } - } - - public static void EmitEndpointMetadataPopulation(this Endpoint endpoint, CodeWriter codeWriter) - { - endpoint.EmitAcceptsMetadata(codeWriter); - endpoint.EmitBuiltinResponseTypeMetadata(codeWriter); - endpoint.EmitCallsToMetadataProvidersForParameters(codeWriter); - endpoint.EmitCallToMetadataProviderForResponse(codeWriter); - } - - public static void EmitFilteredInvocation(this Endpoint endpoint, CodeWriter codeWriter) - { - if (endpoint.Response?.HasNoResponse == true) - { - codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true - ? $"await handler({endpoint.EmitFilteredArgumentList()});" - : $"handler({endpoint.EmitFilteredArgumentList()});"); - codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true - ? "return (object?)Results.Empty;" - : "return ValueTask.FromResult(Results.Empty);"); - } - else if (endpoint.Response?.IsAwaitable == true) - { - codeWriter.WriteLine($"var result = await handler({endpoint.EmitFilteredArgumentList()});"); - codeWriter.WriteLine("return (object?)result;"); - } - else - { - codeWriter.WriteLine($"return ValueTask.FromResult(handler({endpoint.EmitFilteredArgumentList()}));"); - } - } - - public static string EmitFilteredArgumentList(this Endpoint endpoint) - { - if (endpoint.Parameters.Length == 0) - { - return string.Empty; - } - - var sb = new StringBuilder(); - - for (var i = 0; i < endpoint.Parameters.Length; i++) - { - // The null suppression operator on the GetArgument(...) call here is required because we'll occassionally be - // dealing with nullable types here. We could try to do fancy things to branch the logic here depending on - // the nullability, but at the end of the day we are going to call GetArguments(...) - at runtime the nullability - // suppression operator doesn't come into play - so its not worth worrying about. - sb.Append($"ic.GetArgument<{endpoint.Parameters[i].Type.ToDisplayString(EmitterConstants.DisplayFormat)}>({i})!"); - - if (i < endpoint.Parameters.Length - 1) - { - sb.Append(", "); - } - } - - return sb.ToString(); - } - - public static string EmitFilterInvocationContextTypeArgs(this Endpoint endpoint) - { - if (endpoint.Parameters.Length == 0) - { - return string.Empty; - } - - var sb = new StringBuilder(); - - for (var i = 0; i < endpoint.Parameters.Length; i++) - { - sb.Append(endpoint.Parameters[i].Type.ToDisplayString(endpoint.Parameters[i].IsOptional ? NullableFlowState.MaybeNull : NullableFlowState.NotNull, EmitterConstants.DisplayFormat)); - - if (i < endpoint.Parameters.Length - 1) - { - sb.Append(", "); - } - } - - return sb.ToString(); - } -} diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt index 934f3010e7fe..c390f1c57fa5 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt @@ -22,322 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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); } - } } @@ -352,6 +47,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; @@ -374,1756 +70,2042 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(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 - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord)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) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - 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) + if (ic.HttpContext.Response.StatusCode == 400) { - 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; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(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(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(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 - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct)myBindAsyncParam_temp; - } + 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; + } - 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(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet_26_5( + 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 SourceKey(@"TestMapActions.cs", 26)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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.MyBindAsyncStruct.BindAsync(httpContext, parameters[1]); - global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) + if (ic.HttpContext.Response.StatusCode == 400) { - 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; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(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; + 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.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(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(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; - } + 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(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(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet_27_5( + 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 SourceKey(@"TestMapActions.cs", 27)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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.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 + if (ic.HttpContext.Response.StatusCode == 400) { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(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!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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); + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct)myBindAsyncParam_temp; } - async Task RequestHandlerFiltered(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; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 31)] = ( - (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", 31)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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.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(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 28, 5)] + internal static RouteHandlerBuilder MapGet_28_5( + 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 SourceKey(@"TestMapActions.cs", 28)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(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(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(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); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); + + 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) { - 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(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - if (wasParamCheckFailure) +[InterceptsLocation(@"TestMapActions.cs", 29, 5)] + internal static RouteHandlerBuilder MapGet_29_5( + 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 SourceKey(@"TestMapActions.cs", 29)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; + return ValueTask.FromResult(Results.Empty); } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 32)] = ( - (methodInfo, options) => + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); + + 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 GeneratedProducesResponseTypeMetadata(type: null, 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; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + 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; } - async Task RequestHandler(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(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - 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.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 30, 5)] + internal static RouteHandlerBuilder MapGet_30_5( + 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 SourceKey(@"TestMapActions.cs", 30)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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(Results.Empty); } - await httpContext.Response.WriteAsync(result); + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); + + 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 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(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - if (wasParamCheckFailure) +[InterceptsLocation(@"TestMapActions.cs", 31, 5)] + internal static RouteHandlerBuilder MapGet_31_5( + 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 SourceKey(@"TestMapActions.cs", 31)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; + return ValueTask.FromResult(Results.Empty); } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); + + 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 + { + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 32, 5)] + internal static RouteHandlerBuilder MapGet_32_5( + 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 SourceKey(@"TestMapActions.cs", 32)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(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(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(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); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); + + 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 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(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - if (wasParamCheckFailure) + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 33, 5)] + internal static RouteHandlerBuilder MapGet_33_5( + 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 SourceKey(@"TestMapActions.cs", 33)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; + return ValueTask.FromResult(Results.Empty); } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + 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; } - async Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) { - 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; + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - 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.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 34, 5)] + internal static RouteHandlerBuilder MapGet_34_5( + 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 SourceKey(@"TestMapActions.cs", 34)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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(Results.Empty); } - await httpContext.Response.WriteAsync(result); + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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) + { + 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; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - 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; + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - if (wasParamCheckFailure) +[InterceptsLocation(@"TestMapActions.cs", 35, 5)] + internal static RouteHandlerBuilder MapGet_35_5( + 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 SourceKey(@"TestMapActions.cs", 35)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; + return ValueTask.FromResult(Results.Empty); } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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 + { + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 35)] = ( - (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", 35)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 36, 5)] + internal static RouteHandlerBuilder MapGet_36_5( + 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 SourceKey(@"TestMapActions.cs", 36)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(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(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(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 + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 37, 5)] + internal static RouteHandlerBuilder MapGet_37_5( + 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 SourceKey(@"TestMapActions.cs", 37)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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(Results.Empty); } - await httpContext.Response.WriteAsync(result); + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await BindAsync(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; + 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 BindAsync(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(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 38, 5)] + internal static RouteHandlerBuilder MapGet_38_5( + 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 SourceKey(@"TestMapActions.cs", 38)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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.MySimpleBindAsyncStruct.BindAsync(httpContext); - global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) + if (ic.HttpContext.Response.StatusCode == 400) { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncStruct", "myBindAsyncParam", "MySimpleBindAsyncStruct.BindAsync(HttpContext)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; + return ValueTask.FromResult(Results.Empty); } - else + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await BindAsync(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(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(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 39, 5)] + internal static RouteHandlerBuilder MapGet_39_5( + 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 SourceKey(@"TestMapActions.cs", 39)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 36)] = ( - (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", 36)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + 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!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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); + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp; } - async Task RequestHandlerFiltered(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; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 37)] = ( - (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", 37)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - async Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await BindAsync(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 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); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 40, 5)] + internal static RouteHandlerBuilder MapGet_40_5( + 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 SourceKey(@"TestMapActions.cs", 40)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await BindAsync(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 + if (ic.HttpContext.Response.StatusCode == 400) { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface)myBindAsyncParam_temp; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(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 BindAsync(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); + 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 BindAsync(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(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(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 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; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 41, 5)] + internal static RouteHandlerBuilder MapGet_41_5( + 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 SourceKey(@"TestMapActions.cs", 41)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 40)] = ( - (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", 40)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await BindAsync(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; } - async Task RequestHandler(HttpContext httpContext) + 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 { - 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; + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - 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 httpContext_local = httpContext; + var myBindAsyncParam_temp = await BindAsync(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; } - async Task RequestHandlerFiltered(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; + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - if (wasParamCheckFailure) +[InterceptsLocation(@"TestMapActions.cs", 42, 5)] + internal static RouteHandlerBuilder MapGet_42_5( + 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 SourceKey(@"TestMapActions.cs", 42)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; + return ValueTask.FromResult(Results.Empty); } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var parameters = del.Method.GetParameters(); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 41)] = ( - (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", 41)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await BindAsync(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); + } + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - async Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await BindAsync(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; - } + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await BindAsync(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(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(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 43, 5)] + internal static RouteHandlerBuilder MapGet_43_5( + 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 SourceKey(@"TestMapActions.cs", 43)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await BindAsync(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 + if (ic.HttpContext.Response.StatusCode == 400) { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface)myBindAsyncParam_temp; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync.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(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(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(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(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.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; - } + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync.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; - 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(httpContext, httpContext_local, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 44, 5)] + internal static RouteHandlerBuilder MapGet_44_5( + 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 SourceKey(@"TestMapActions.cs", 44)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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.IBindAsync.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 + if (ic.HttpContext.Response.StatusCode == 400) { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord)myBindAsyncParam_temp; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"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)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync.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.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; + return; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync.BindAsync(httpContext); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?)myBindAsyncParam_temp; + 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(httpContext, myBindAsyncParam_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync.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(httpContext, myBindAsyncParam_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt index 915af282c6dd..dba5e18b9b11 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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> 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); } - } } @@ -67,6 +47,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; @@ -89,180 +70,214 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost_25_13( + 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 GeneratedAcceptsMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: false, contentTypes: GeneratedMetadataConstants.JsonContentType)); - PopulateMetadataForEndpoint>(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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: typeof(Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: false, contentTypes: GeneratedMetadataConstants.JsonContentType)); + PopulateMetadataForEndpoint>(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, Microsoft.AspNetCore.Http.HttpResults.Ok (Microsoft.AspNetCore.Http.Generators.Tests.Todo arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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>)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo"); + 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(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo"); - 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(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo"); + 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(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo"); - var todo_local = todo_resolveBodyResult.Item2; - if (!todo_resolveBodyResult.Item1) - { - return; - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local!)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } - if (wasParamCheckFailure) +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapPost_27_5( + 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 SourceKey(@"TestMapActions.cs", 27)); + options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: typeof(Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: true, contentTypes: GeneratedMetadataConstants.JsonContentType)); + PopulateMetadataForEndpoint>(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, Microsoft.AspNetCore.Http.HttpResults.Ok (Microsoft.AspNetCore.Http.Generators.Tests.Todo? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; + return ValueTask.FromResult(Results.Empty); } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local!)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedAcceptsMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: true, contentTypes: GeneratedMetadataConstants.JsonContentType)); - PopulateMetadataForEndpoint>(methodInfo, options.EndpointBuilder); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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>)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo"); + var todo_local = todo_resolveBodyResult.Item2; + if (!todo_resolveBodyResult.Item1) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(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(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo"); - 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(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo"); + 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(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo"); - var todo_local = todo_resolveBodyResult.Item2; - if (!todo_resolveBodyResult.Item1) - { - return; - } + return; + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt index dd7e828f6225..e0870ac84af9 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,123 +70,143 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - Task RequestHandler(HttpContext httpContext) + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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(); + Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new 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(element!, CultureInfo.InvariantCulture, out var parsed_element)) { - var element = p_temp[i]; - if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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, jsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); + } - 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(); + Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new 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(element!, CultureInfo.InvariantCulture, out var parsed_element)) { - var element = p_temp[i]; - if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt index 49f688148a48..8503c403810d 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,97 +70,117 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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) + if (wasParamCheckFailure) { - 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, jsonTypeInfo); + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); + } - 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(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt index fb678ab02ec2..1b98e5083e18 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,97 +70,117 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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) + if (wasParamCheckFailure) { - 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, jsonTypeInfo); + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); + } - 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(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt index 769fcced92f5..e5e7649ae108 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,123 +70,143 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - Task RequestHandler(HttpContext httpContext) + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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(); + Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new 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(element!, CultureInfo.InvariantCulture, out var parsed_element)) { - var element = p_temp[i]; - if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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, jsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); + } - 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(); + Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new 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(element!, CultureInfo.InvariantCulture, out var parsed_element)) { - var element = p_temp[i]; - if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt index dcf0b92197ca..0878e43b79de 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,96 +70,116 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(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!; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(p_local); - return httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); - } + 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!; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - 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!; + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt index 651b7d1bd675..e555bef7c674 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,96 +70,116 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(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!; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(p_local); - return httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); - } + 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!; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - 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!; + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt index 4f594f144253..ac0eac5227da 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt @@ -22,67 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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.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); - } - 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); } - } } @@ -97,6 +47,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; @@ -119,253 +70,301 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.TestService arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(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(); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - 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); - } + 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(); - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - 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(); - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, svc_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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>)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(); + + if (wasParamCheckFailure) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument>(0)!)); - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, svc_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: svc (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) - var svc_local = httpContext.RequestServices.GetRequiredService>(); + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - 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 +[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet_26_5( + 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 SourceKey(@"TestMapActions.cs", 26)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.Collections.Generic.IEnumerable arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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(Results.Empty); } - return httpContext.Response.WriteAsync(result); - } + return ValueTask.FromResult(handler(ic.GetArgument>(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: svc (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) - var svc_local = httpContext.RequestServices.GetRequiredService>(); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create>(httpContext, svc_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: svc (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) + var svc_local = httpContext.RequestServices.GetRequiredService>(); + + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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 logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: svc (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) + var svc_local = httpContext.RequestServices.GetRequiredService>(); + + if (wasParamCheckFailure) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument>(1)!)); - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create>(httpContext, svc_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - 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();; - // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) - var svcs_local = httpContext.RequestServices.GetRequiredService>(); + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - 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 +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet_27_5( + 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 SourceKey(@"TestMapActions.cs", 27)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.TestService? arg0, System.Collections.Generic.IEnumerable arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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(Results.Empty); } - return httpContext.Response.WriteAsync(result); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument>(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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();; + // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) + var svcs_local = httpContext.RequestServices.GetRequiredService>(); + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(svc_local, svcs_local); + if (result is string) { - 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();; - // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) - var svcs_local = httpContext.RequestServices.GetRequiredService>(); + 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>(httpContext, svc_local, svcs_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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();; + // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) + var svcs_local = httpContext.RequestServices.GetRequiredService>(); + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create>(httpContext, svc_local, svcs_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt index b8746767aac6..aa0a43bbfcbb 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,479 +70,555 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(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)) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "queryValue", "query string"); + return ValueTask.FromResult(Results.Empty); } - var queryValue_temp = (string?)queryValue_raw; - string queryValue_local = queryValue_temp!; + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - 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); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - async Task RequestHandlerFiltered(HttpContext httpContext) + 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)) { - 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!; + 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(httpContext, queryValue_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - Task RequestHandler(HttpContext httpContext) - { - 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!; + 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(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); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, queryValue_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet_26_5( + 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 SourceKey(@"TestMapActions.cs", 26)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - 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)) + if (ic.HttpContext.Response.StatusCode == 400) { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "headerValue", "header"); + return ValueTask.FromResult(Results.Empty); } - var headerValue_temp = (string?)headerValue_raw; - string headerValue_local = headerValue_temp!; + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, headerValue_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + 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!; - Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) { - 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!; + 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); + } - 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: 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!; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - 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!; + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, headerValue_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - if (wasParamCheckFailure) + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet_27_5( + 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 SourceKey(@"TestMapActions.cs", 27)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; + return ValueTask.FromResult(Results.Empty); } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, routeValue_local!)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 28)] = ( - (methodInfo, options) => + 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", 28)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + 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) { - 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(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!; + 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(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); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, routeValue_local!)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 28, 5)] + internal static RouteHandlerBuilder MapGet_28_5( + 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 SourceKey(@"TestMapActions.cs", 28)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - 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 }) + if (ic.HttpContext.Response.StatusCode == 400) { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "value", "route or query string"); + return ValueTask.FromResult(Results.Empty); } - var value_temp = (string?)value_raw; - string value_local = value_temp!; + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, value_local!)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("value", options?.RouteParameterNames); + + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 29)] = ( - (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", 29)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + 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(httpContext, value_local!)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 29, 5)] + internal static RouteHandlerBuilder MapGet_29_5( + 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 SourceKey(@"TestMapActions.cs", 29)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(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 }) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "value", "route or query string"); + return ValueTask.FromResult(Results.Empty); } - var value_temp = (string?)value_raw; - string value_local = value_temp!; + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - 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); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("value", options?.RouteParameterNames); + + 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!; - async Task RequestHandlerFiltered(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!; + 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); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, value_local!)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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(httpContext, value_local!)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt index 9e35af5a26de..341eb17689dd 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,124 +70,144 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var p_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("p", options.RouteParameterNames); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - Task RequestHandler(HttpContext httpContext) + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var p_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("p", options?.RouteParameterNames); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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(); + Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new 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(element!, CultureInfo.InvariantCulture, out var parsed_element)) { - var element = p_temp[i]; - if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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, jsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local!); + return httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); + } - 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(); + Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new 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(element!, CultureInfo.InvariantCulture, out var parsed_element)) { - var element = p_temp[i]; - if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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(httpContext, p_local!)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local!)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt index c535668036c6..4df90436d56e 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,134 +70,141 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); } - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); - 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, jsonTypeInfo); + } - if (wasParamCheckFailure) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt index c535668036c6..4df90436d56e 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,134 +70,141 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); } - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); - 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, jsonTypeInfo); + } - if (wasParamCheckFailure) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt index c535668036c6..4df90436d56e 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,134 +70,141 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); } - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); - 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, jsonTypeInfo); + } - if (wasParamCheckFailure) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt index 9654865388b9..2ce076cd9bea 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,134 +70,141 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); } - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - 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, jsonTypeInfo); + } - if (wasParamCheckFailure) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt index 6486d2e8c1fc..3faf665054a5 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,140 +70,160 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost_25_13( + 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 SourceKey(@"TestMapActions.cs", 25)); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(Microsoft.AspNetCore.Http.Generators.Tests.Todo)), + (false, typeof(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(); - 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 GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.Todo arg0, Microsoft.AspNetCore.Http.Generators.Tests.TestService arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serviceProviderIsService = serviceProvider?.GetService(); - var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "Todo", "todo", serviceProviderIsService); - var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TestService", "svc", 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - async Task RequestHandler(HttpContext httpContext) + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serviceProviderIsService = serviceProvider?.GetService(); + var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "Todo", "todo", serviceProviderIsService); + var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TestService", "svc", serviceProviderIsService); + + 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(httpContext, todo_local!, svc_local!)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local!, svc_local!)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt index bfb09e9f7f35..b2c1ba21bc95 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,97 +70,117 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpRequest arg0, Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - 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); - } + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var req_local = httpContext.Request; + var res_local = httpContext.Response; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + 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(httpContext, req_local, res_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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(httpContext, req_local, res_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt index 99e900ce4764..69709f601b4e 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,131 +70,151 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String arg0, System.String arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - Task RequestHandler(HttpContext httpContext) + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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(httpContext, p1_local, p2_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p1_local, p2_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt index acbfbab82d85..88e7e027491b 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,91 +70,111 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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(Results.Empty); - } - return ValueTask.FromResult(handler()); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(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)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt index acbfbab82d85..88e7e027491b 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,91 +70,111 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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(Results.Empty); - } - return ValueTask.FromResult(handler()); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(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)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt index 53dbe79f93d5..78ae19ba9db1 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,86 +70,106 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), statusCode: StatusCodes.Status200OK, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(Microsoft.AspNetCore.Http.Generators.Tests.Todo), statusCode: StatusCodes.Status200OK, 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, Microsoft.AspNetCore.Http.Generators.Tests.Todo () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)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(Results.Empty); - } - return ValueTask.FromResult(handler()); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler()); + }, + options.EndpointBuilder, + handler.Method); + } - Task RequestHandler(HttpContext httpContext) + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(Microsoft.AspNetCore.Http.Generators.Tests.Todo)); + + 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.WriteToResponseAsync(result, httpContext, jsonTypeInfo); + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(); + return GeneratedRouteBuilderExtensionsCore.WriteToResponseAsync(result, httpContext, jsonTypeInfo); + } - 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)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt index 2750e53d69da..5df72e93bb51 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,83 +70,103 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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(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 SourceKey(@"TestMapActions.cs", 25)); + PopulateMetadataForEndpoint(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, Microsoft.AspNetCore.Http.HttpResults.ValidationProblem () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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(Results.Empty); - } - return ValueTask.FromResult(handler()); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(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)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt index 1e4d6ed1112f..932e4d144376 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -67,6 +47,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; @@ -89,83 +70,103 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 SourceKey(@"TestMapActions.cs", 25)); + 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; + 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; - - 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(Results.Empty); - } - handler(); return ValueTask.FromResult(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(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)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt index 22c5e13b2535..7e9594d4ba7b 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,129 +70,149 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - 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)) { - 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; - 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(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt index 8ce33a2fc917..6e3264c8a6ac 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,129 +70,149 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - 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)) { - 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(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(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(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(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(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt index 9825fa84f052..85b50b0f1254 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,103 +70,123 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(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!; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - 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); - } + 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!; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + 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(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt index 43f428d4bc62..400dea4e9c28 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,119 +70,139 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost_25_13( + 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 SourceKey(@"TestMapActions.cs", 25)); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(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(); - 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 GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - var parameterInfos = methodInfo.GetParameters(); - var x_ParameterInfo = parameterInfos[0]; - PopulateMetadataForParameter(x_ParameterInfo, options.EndpointBuilder); - PopulateMetadataForEndpoint(methodInfo, options.EndpointBuilder); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + var parameterInfos = methodInfo.GetParameters(); + var x_ParameterInfo = parameterInfos[0]; + PopulateMetadataForParameter(x_ParameterInfo, options.EndpointBuilder); + PopulateMetadataForEndpoint(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 (Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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 logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serviceProviderIsService = serviceProvider?.GetService(); - var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", 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(Results.Empty); - } - handler(ic.GetArgument(0)!); return ValueTask.FromResult(Results.Empty); - }, - options.EndpointBuilder, - handler.Method); - } + } + handler(ic.GetArgument(0)!); + return ValueTask.FromResult(Results.Empty); + }, + options.EndpointBuilder, + handler.Method); + } - async Task RequestHandler(HttpContext httpContext) + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serviceProviderIsService = serviceProvider?.GetService(); + var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", serviceProviderIsService); + + 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(httpContext, x_local!)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, x_local!)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt index 778a2a41e5eb..e97e71377612 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt @@ -22,38 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 httpMethods, - global::System.Func 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, - httpMethods, - filePath, - lineNumber); } - } } @@ -68,6 +47,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; @@ -90,140 +70,148 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapMethods_25_13( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - 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) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + httpMethods, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt index 778a2a41e5eb..e97e71377612 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt @@ -22,38 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 httpMethods, - global::System.Func 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, - httpMethods, - filePath, - lineNumber); } - } } @@ -68,6 +47,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; @@ -90,140 +70,148 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapMethods_25_13( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - 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) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + httpMethods, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt index 778a2a41e5eb..e97e71377612 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt @@ -22,38 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 httpMethods, - global::System.Func 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, - httpMethods, - filePath, - lineNumber); } - } } @@ -68,6 +47,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; @@ -90,140 +70,148 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapMethods_25_13( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - 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) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + httpMethods, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt index 778a2a41e5eb..e97e71377612 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt @@ -22,38 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 httpMethods, - global::System.Func 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, - httpMethods, - filePath, - lineNumber); } - } } @@ -68,6 +47,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; @@ -90,140 +70,148 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapMethods_25_13( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - 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) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + httpMethods, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt index 95b3d720d8af..8fdac3b40f96 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,140 +70,147 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost_25_13( + 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - 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) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt index 5de4e1cf285e..cdc4d2d7fed1 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,134 +70,141 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost_25_13( + 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(System.Int32), statusCode: StatusCodes.Status200OK, 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, System.Int32 (System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) { - 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(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - if (!serviceProviderIsService.IsService(type)) + if (ic.HttpContext.Response.StatusCode == 400) { - options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; + return ValueTask.FromResult(Results.Empty); } - } - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; + var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(System.Int32)); + + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serializerOptions = serviceProvider?.GetService>()?.Value.SerializerOptions ?? new JsonOptions().SerializerOptions; - var jsonTypeInfo = (JsonTypeInfo)serializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } - - if (wasParamCheckFailure) + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, jsonTypeInfo); } - 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_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); - 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, jsonTypeInfo); + } - if (wasParamCheckFailure) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p"); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; + return; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } + - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt index a5d31fcc54bd..91e985dba845 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt @@ -22,67 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - 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> 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> 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); - } - } } @@ -97,6 +47,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; @@ -119,294 +70,356 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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(Results.Empty); - } - return ValueTask.FromResult(handler()); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(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)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + if (wasParamCheckFailure) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler()); - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - Task RequestHandler(HttpContext httpContext) + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet_26_5( + 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 SourceKey(@"TestMapActions.cs", 26)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - 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 + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + return ValueTask.FromResult(Results.Empty); } - return httpContext.Response.WriteAsync(result); - } + return ValueTask.FromResult(handler()); + }, + options.EndpointBuilder, + handler.Method); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 27)] = ( - (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", 27)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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>)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandler(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet_27_5( + 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 SourceKey(@"TestMapActions.cs", 27)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.Threading.Tasks.Task () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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 RequestHandlerFiltered(HttpContext httpContext) + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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>)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandler(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 28, 5)] + internal static RouteHandlerBuilder MapGet_28_5( + 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 SourceKey(@"TestMapActions.cs", 28)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.Threading.Tasks.ValueTask () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt index e6c89700f015..40f4fae4c933 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt @@ -22,67 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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 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); - } - 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 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); } - } } @@ -97,6 +47,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; @@ -119,239 +70,287 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_25_13( + 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 GeneratedProducesResponseTypeMetadata(type: null, 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 SourceKey(@"TestMapActions.cs", 25)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpRequest arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - 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); - } + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var req_local = httpContext.Request; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var req_local = httpContext.Request; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, req_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, req_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - var res_local = httpContext.Response; + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - 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 +[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet_26_5( + 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 SourceKey(@"TestMapActions.cs", 26)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpResponse arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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(Results.Empty); } - return httpContext.Response.WriteAsync(result); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - 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(httpContext, res_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + Task RequestHandler(HttpContext httpContext) + { + 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedProducesResponseTypeMetadata(type: null, 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)del; - EndpointFilterDelegate? filteredInvocation = null; - - 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, res_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - var req_local = httpContext.Request; - var res_local = httpContext.Response; + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - 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 +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet_27_5( + 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 SourceKey(@"TestMapActions.cs", 27)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.HttpRequest arg0, Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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(Results.Empty); } - return httpContext.Response.WriteAsync(result); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + + 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) { - 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(httpContext, req_local, res_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + 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(httpContext, req_local, res_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt index 0c1e0ff39d18..e8233988aa02 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt @@ -22,37 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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 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); } - } } @@ -67,6 +47,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; @@ -89,187 +70,207 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 29, 5)] + internal static RouteHandlerBuilder MapPost_29_5( + 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 GeneratedAcceptsMetadata(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 SourceKey(@"TestMapActions.cs", 29)); + options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(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 (Microsoft.AspNetCore.Http.HttpContext arg0, Microsoft.AspNetCore.Http.IFormFile arg1, Microsoft.AspNetCore.Http.IFormFileCollection arg2, Microsoft.AspNetCore.Http.IFormCollection arg3, Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord arg4) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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 logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(Results.Empty); - } - handler(ic.GetArgument(0)!, ic.GetArgument(1)!, ic.GetArgument(2)!, ic.GetArgument(3)!, ic.GetArgument(4)!); return ValueTask.FromResult(Results.Empty); - }, - options.EndpointBuilder, - handler.Method); - } + } + handler(ic.GetArgument(0)!, ic.GetArgument(1)!, ic.GetArgument(2)!, ic.GetArgument(3)!, ic.GetArgument(4)!); + return ValueTask.FromResult(Results.Empty); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - 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(httpContext, httpContext_local, file_local!, fileCollection_local!, collection_local!, tryParseRecord_local!)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, file_local!, fileCollection_local!, collection_local!, tryParseRecord_local!)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt index 1e121483c243..b4692cf53c1f 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt @@ -22,97 +22,17 @@ namespace Microsoft.AspNetCore.Builder 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. +namespace System.Runtime.CompilerServices +{ %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints + [AttributeUsage(AttributeTargets.Method)] + file sealed class InterceptsLocationAttribute : Attribute { - 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 string[] PutVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Put }; - private static readonly string[] DeleteVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Delete }; - private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; - - 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); - } - 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) + public InterceptsLocationAttribute(string filePath, int line, int column) { - 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 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 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 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); } - } } @@ -127,6 +47,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; @@ -149,507 +70,583 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + private static readonly string[] GetVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Get }; + private static readonly string[] PostVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Post }; + private static readonly string[] PutVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Put }; + private static readonly string[] DeleteVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Delete }; + private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; + + [InterceptsLocation(@"TestMapActions.cs", 44, 5)] + internal static RouteHandlerBuilder MapGet_44_5( + 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 SourceKey(@"TestMapActions.cs", 44)); + 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 (Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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 logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(Results.Empty); - } - handler(ic.GetArgument(0)!); return ValueTask.FromResult(Results.Empty); - }, - options.EndpointBuilder, - handler.Method); - } + } + handler(ic.GetArgument(0)!); + return ValueTask.FromResult(Results.Empty); + }, + options.EndpointBuilder, + handler.Method); + } - Task RequestHandler(HttpContext httpContext) + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + + 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(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; + System.Int32 Value_parsed_temp = default; + if (GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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(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; + System.Int32 Value_parsed_temp = default; + if (GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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(httpContext, args_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 45, 5)] + internal static RouteHandlerBuilder MapGet_45_5( + 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 SourceKey(@"TestMapActions.cs", 45)); + 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 (Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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 logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - 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(Results.Empty); - } - handler(ic.GetArgument(0)!); return ValueTask.FromResult(Results.Empty); - }, - options.EndpointBuilder, - handler.Method); - } + } + handler(ic.GetArgument(0)!); + return ValueTask.FromResult(Results.Empty); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var Value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("Value", options?.RouteParameterNames); - 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(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(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 }) + { + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("int", "Value", "route or query string"); + } + var Value_temp = (string?)Value_raw; + if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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(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(httpContext, args_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 46, 5)] + internal static RouteHandlerBuilder MapGet_46_5( + 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 SourceKey(@"TestMapActions.cs", 46)); + 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 (Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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 logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - - 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(Results.Empty); - } - handler(ic.GetArgument(0)!); return ValueTask.FromResult(Results.Empty); - }, - options.EndpointBuilder, - handler.Method); - } + } + handler(ic.GetArgument(0)!); + return ValueTask.FromResult(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; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext(HttpContext_local, User_local, Request_local, Response_local); + 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; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - handler(args_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); + 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(httpContext, args_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedAcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType)); - options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 47, 5)] + internal static RouteHandlerBuilder MapPost_47_5( + 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 SourceKey(@"TestMapActions.cs", 47)); + options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType)); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: null, 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, System.String (Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serviceProviderIsService = serviceProvider?.GetService(); - var Todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TodoStruct", "Todo", 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(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - async Task RequestHandler(HttpContext httpContext) + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serviceProviderIsService = serviceProvider?.GetService(); + var Todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TodoStruct", "Todo", serviceProviderIsService); + + 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) { - 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; - 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); + 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(httpContext, args_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 GeneratedAcceptsMetadata(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(Value_ParameterInfo, options.EndpointBuilder); - PopulateMetadataForEndpoint(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.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 48, 5)] + internal static RouteHandlerBuilder MapGet_48_5( + 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 SourceKey(@"TestMapActions.cs", 48)); + options.EndpointBuilder.Metadata.Add(new GeneratedAcceptsMetadata(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(Value_ParameterInfo, options.EndpointBuilder); + PopulateMetadataForEndpoint(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 (Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + 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 logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var serviceProviderIsService = serviceProvider?.GetService(); - var Value_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "AddsCustomParameterMetadataAsProperty", "Value", 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(Results.Empty); - } - handler(ic.GetArgument(0)!); return ValueTask.FromResult(Results.Empty); - }, - options.EndpointBuilder, - handler.Method); - } + } + handler(ic.GetArgument(0)!); + return ValueTask.FromResult(Results.Empty); + }, + options.EndpointBuilder, + handler.Method); + } + + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var serviceProviderIsService = serviceProvider?.GetService(); + var Value_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "AddsCustomParameterMetadataAsProperty", "Value", serviceProviderIsService); - 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(httpContext, args_local)); - await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + await GeneratedRouteBuilderExtensionsCore.ExecuteObjectResult(result, httpContext); + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - }; internal static RouteHandlerBuilder MapCore( this IEndpointRouteBuilder routes, string pattern, Delegate handler, IEnumerable? 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(Delegate d, T _) where T : Delegate + { + return (T)d; + } + private static EndpointFilterDelegate BuildFilterDelegate(EndpointFilterDelegate filteredInvocation, EndpointBuilder builder, MethodInfo mi) { var routeHandlerFilters = builder.FilterFactories; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs index 73765896ab98..dd8cf9b746cf 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.CodeAnalysis; using Microsoft.AspNetCore.Http.RequestDelegateGenerator; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNetCore.Http.Generators.Tests; @@ -37,4 +38,51 @@ public async Task MapAction_ExplicitRouteParamWithInvalidName_SimpleReturn() var exception = await Assert.ThrowsAsync(() => endpoint.RequestDelegate(httpContext)); Assert.Equal("'invalidName' is not a route parameter.", exception.Message); } + + [Fact] + public async Task MapAction_SupportsParametersWithDifferingNullability() + { + var source = """ +app.MapGet("/hello", (string name) => $"Hello {name}!"); +app.MapGet("/hello2", (string? name) => $"Hello {name ?? string.Empty}!"); +"""; + var (result, compilation) = await RunGeneratorAsync(source); + var endpoints = GetEndpointsFromCompilation(compilation); + + foreach (var endpoint in endpoints) + { + var httpContext = CreateHttpContext(); + httpContext.Request.Query = new QueryCollection(new Dictionary() + { + { + "name", "world" + } + }); + await endpoint.RequestDelegate(httpContext); + await VerifyResponseBodyAsync(httpContext, "Hello world!"); + } + } + + [Fact] + public async Task MapAction_SupportsMultipleMapsOnTheSameLine() + { + var source = """ +app.MapGet("/hello", (string name) => $"Hello {name}!"); app.MapGet("/hello2", (string? name) => $"Hello {name ?? string.Empty}!"); +"""; + var (result, compilation) = await RunGeneratorAsync(source); + var endpoints = GetEndpointsFromCompilation(compilation); + + foreach (var endpoint in endpoints) + { + var httpContext = CreateHttpContext(); + httpContext.Request.Query = new QueryCollection(new Dictionary() + { + { + "name", "world" + } + }); + await endpoint.RequestDelegate(httpContext); + await VerifyResponseBodyAsync(httpContext, "Hello world!"); + } + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs index 443768397f0b..4c08f71804f6 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs @@ -31,12 +31,11 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest protected abstract bool IsGeneratorEnabled { get; } + private static readonly CSharpParseOptions _parseOptions = new CSharpParseOptions(LanguageVersion.Preview).WithFeatures(new[] { new KeyValuePair("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 +54,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, @@ -73,24 +73,24 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest return (Assert.Single(runResult.Results), updatedCompilation); } - internal static RequestDelegateGenerator.StaticRouteHandlerModel.Endpoint GetStaticEndpoint(GeneratorRunResult result, string stepName) => + internal static RequestDelegateGenerator.StaticRouteHandler.Model.Endpoint GetStaticEndpoint(GeneratorRunResult result, string stepName) => Assert.Single(GetStaticEndpoints(result, stepName)); - internal static RequestDelegateGenerator.StaticRouteHandlerModel.Endpoint[] GetStaticEndpoints(GeneratorRunResult result, string stepName) + internal static RequestDelegateGenerator.StaticRouteHandler.Model.Endpoint[] GetStaticEndpoints(GeneratorRunResult result, string stepName) { // We only invoke the generator once in our test scenarios if (result.TrackedSteps.TryGetValue(stepName, out var staticEndpointSteps)) { return staticEndpointSteps .SelectMany(step => step.Outputs) - .Select(output => Assert.IsType(output.Value)) + .Select(output => Assert.IsType(output.Value)) .ToArray(); } - return Array.Empty(); + return Array.Empty(); } - internal static void VerifyStaticEndpointModel(GeneratorRunResult? result, Action runAssertions) + internal static void VerifyStaticEndpointModel(GeneratorRunResult? result, Action runAssertions) { if (result.HasValue) { @@ -98,7 +98,7 @@ internal static void VerifyStaticEndpointModel(GeneratorRunResult? result, Actio } } - internal static void VerifyStaticEndpointModels(GeneratorRunResult? result, Action runAssertions) + internal static void VerifyStaticEndpointModels(GeneratorRunResult? result, Action runAssertions) { if (result.HasValue) { @@ -134,7 +134,7 @@ internal Endpoint[] GetEndpointsFromCompilation(Compilation compilation, bool? e 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); @@ -301,7 +301,7 @@ private static Project CreateProject() .AddProject(projectName, projectName, LanguageNames.CSharp) .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithNullableContextOptions(NullableContextOptions.Enable)) - .WithParseOptions(new CSharpParseOptions(LanguageVersion.CSharp11)); + .WithParseOptions(_parseOptions); // Add in required metadata references var resolver = new AppLocalResolver(); diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Arrays.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Arrays.cs index d7bf9bdef497..4c4fcb8b2e40 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Arrays.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Arrays.cs @@ -9,7 +9,7 @@ using System.Text.Encodings.Web; using System.Text.Json; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.Extensions.Primitives; using Microsoft.VisualStudio.TestPlatform.Common; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.BindAsync.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.BindAsync.cs index d941bd4e52bb..a0ce3321b8c1 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.BindAsync.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.BindAsync.cs @@ -12,7 +12,7 @@ using System.Text.Json; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Json; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs index dae0f0581d0e..432b5bfb2855 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs @@ -10,7 +10,7 @@ using System.Text.Encodings.Web; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Metadata; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.AspNetCore.Routing.Patterns; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.QueryParameters.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.QueryParameters.cs index 8ad843fab793..a7f3e659cc7e 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.QueryParameters.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.QueryParameters.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Text; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Primitives; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.SpecialTypes.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.SpecialTypes.cs index f74c5e367c1a..edfb022175a8 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.SpecialTypes.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.SpecialTypes.cs @@ -12,7 +12,7 @@ using System.Text.Encodings.Web; using System.Text.Json; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Primitives; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.TryParse.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.TryParse.cs index 9213f23b869c..90dc22a01aa1 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.TryParse.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.TryParse.cs @@ -6,7 +6,7 @@ using System.Reflection; using System.Reflection.Metadata; using System.Text.Encodings.Web; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.Extensions.Primitives; namespace Microsoft.AspNetCore.Http.Generators.Tests; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.cs index 8823f162b56b..261982b24fc1 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.cs @@ -1,17 +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.Globalization; -using System.Net; -using System.Net.Sockets; -using System.Numerics; -using System.Reflection; -using System.Reflection.Metadata; -using System.Text; -using System.Text.Encodings.Web; -using System.Text.Json; -using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandler.Model; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Primitives; diff --git a/src/Identity/Core/src/IdentityApiEndpointRouteBuilderExtensions.cs b/src/Identity/Core/src/IdentityApiEndpointRouteBuilderExtensions.cs index 11a40a5e74be..3a345434bbb6 100644 --- a/src/Identity/Core/src/IdentityApiEndpointRouteBuilderExtensions.cs +++ b/src/Identity/Core/src/IdentityApiEndpointRouteBuilderExtensions.cs @@ -27,6 +27,8 @@ public static class IdentityApiEndpointRouteBuilderExtensions /// Call to add a prefix to all the endpoints. /// /// An to further customize the added endpoints. + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("AOT", "IL3050", Justification = "This implementation invokes uses compile-time code gen to construct the RequestDelegate.")] + [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "This implementation invokes uses compile-time code gen to construct the RequestDelegate.")] public static IEndpointConventionBuilder MapIdentityApi(this IEndpointRouteBuilder endpoints) where TUser : class, new() { ArgumentNullException.ThrowIfNull(endpoints); diff --git a/src/Shared/RoslynUtils/CodeWriter.cs b/src/Shared/RoslynUtils/CodeWriter.cs index 079aad0085dd..eff1aa12a9c1 100644 --- a/src/Shared/RoslynUtils/CodeWriter.cs +++ b/src/Shared/RoslynUtils/CodeWriter.cs @@ -30,6 +30,12 @@ public void EndBlockWithComma() 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 diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj b/src/SignalR/clients/csharp/Client.SourceGenerator/src/Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj index 049814d8bc61..4da52ce626de 100644 --- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj +++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj @@ -5,6 +5,7 @@ false true false + true