From 7b491a94be89cb76cb5ca4ef687f6cad4a1ed25e Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Wed, 14 Jun 2023 15:22:04 -0700 Subject: [PATCH 1/4] Update RDG to use interceptors feature --- eng/SourceBuildPrebuiltBaseline.xml | 2 +- eng/Version.Details.xml | 21 +- eng/Versions.props | 20 +- .../Microsoft.AspNetCore.App.Analyzers.csproj | 1 + .../src/Analyzers/Resources.resx | 8 +- ...osoft.AspNetCore.App.Analyzers.Test.csproj | 2 + ...meworkParametersCompletionProviderTests.cs | 2 + .../RoutePatternCompletionProviderTests.cs | 2 + ...tCore.Http.RequestDelegateGenerator.csproj | 1 + .../gen/RequestDelegateGenerator.cs | 226 +- .../gen/RequestDelegateGeneratorSources.cs | 104 +- .../gen/RequestDelegateGeneratorSuppressor.cs | 74 + .../gen/StaticRouteHandlerModel/Endpoint.cs | 11 +- .../EndpointParameter.cs | 9 +- .../InvocationOperationExtensions.cs | 15 + .../StaticRouteHandlerModel.Emitter.cs | 22 +- ...MapAction_BindAsync_Snapshot.generated.txt | 3902 ++++++++--------- ...Param_ComplexReturn_Snapshot.generated.txt | 377 +- ...Header_ComplexTypeArrayParam.generated.txt | 243 +- ...der_NullableStringArrayParam.generated.txt | 211 +- ...licitHeader_StringArrayParam.generated.txt | 211 +- ...tQuery_ComplexTypeArrayParam.generated.txt | 243 +- ...ery_NullableStringArrayParam.generated.txt | 209 +- ...plicitQuery_StringArrayParam.generated.txt | 209 +- ...eParam_SimpleReturn_Snapshot.generated.txt | 559 ++- ...Source_SimpleReturn_Snapshot.generated.txt | 609 +-- ...tQuery_ComplexTypeArrayParam.generated.txt | 245 +- ...ery_NullableStringArrayParam.generated.txt | 271 +- ...gArrayParam_EmptyQueryValues.generated.txt | 271 +- ...ngArrayParam_QueryNotPresent.generated.txt | 271 +- ...plicitQuery_StringArrayParam.generated.txt | 271 +- ...ce_HandlesBothJsonAndService.generated.txt | 289 +- ...pecialTypeParam_StringReturn.generated.txt | 215 +- ...ipleStringParam_StringReturn.generated.txt | 277 +- ...aram_StringReturn_WithFilter.generated.txt | 203 +- ...n_ReturnsString_Has_Metadata.generated.txt | 203 +- ...ion_ReturnsTodo_Has_Metadata.generated.txt | 189 +- ...onProblemResult_Has_Metadata.generated.txt | 187 +- ..._ReturnsVoid_Has_No_Metadata.generated.txt | 183 +- ...omplexTypeParam_StringReturn.generated.txt | 261 +- ...SingleEnumParam_StringReturn.generated.txt | 261 +- ...ngValueProvided_StringReturn.generated.txt | 225 +- ...MetadataEmitter_Has_Metadata.generated.txt | 245 +- ...AndBody_ShouldUseQueryString.generated.txt | 287 +- ...AndBody_ShouldUseQueryString.generated.txt | 287 +- ...String_AndBody_ShouldUseBody.generated.txt | 287 +- ...String_AndBody_ShouldUseBody.generated.txt | 287 +- ...String_AndBody_ShouldUseBody.generated.txt | 285 +- ...hArrayQueryString_ShouldFail.generated.txt | 271 +- ...pAction_NoParam_StringReturn.generated.txt | 571 +-- ...tion_WithParams_StringReturn.generated.txt | 537 ++- ...ateValidateGeneratedFormCode.generated.txt | 375 +- ...terceptorsFromDifferentFiles.generated.txt | 424 ++ .../VerifyAsParametersBaseline.generated.txt | 1047 +++-- .../CompileTimeCreationTests.cs | 65 + .../RequestDelegateCreationTestBase.cs | 38 +- .../RequestDelegateCreationTests.Metadata.cs | 3 +- .../MinimalSample/MinimalSample.csproj | 1 + .../src/Microsoft.AspNetCore.Identity.csproj | 1 + src/Shared/RoslynUtils/CodeWriter.cs | 6 + .../IncrementalValuesProviderExtensions.cs | 37 + .../RoslynUtils/SyntaxTreeExtensions.cs | 19 +- ...Core.SignalR.Client.SourceGenerator.csproj | 1 + 63 files changed, 7876 insertions(+), 8313 deletions(-) create mode 100644 src/Http/Http.Extensions/gen/RequestDelegateGeneratorSuppressor.cs create mode 100644 src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt create mode 100644 src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs diff --git a/eng/SourceBuildPrebuiltBaseline.xml b/eng/SourceBuildPrebuiltBaseline.xml index e243be4b0ae7..0df2ea7c3d6a 100644 --- a/eng/SourceBuildPrebuiltBaseline.xml +++ b/eng/SourceBuildPrebuiltBaseline.xml @@ -20,7 +20,7 @@ - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 736b72e2ffa1..7fa8af210533 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -194,6 +194,11 @@ 0d04efdab9f26bad07edc881dc7fa088337b8562 + + https://github.com/dotnet/symreader + 27e584661980ee6d82c419a2a471ae505b7d122e + + https://github.com/dotnet/runtime f8cb3c760030ec9443d0d01d3f3ffd31fb92d9f7 @@ -335,22 +340,22 @@ - + https://github.com/dotnet/roslyn - 65df6b1065bae316232a6c9907a8be995302fb5e + 1aa759af23d2a29043ea44fcef5bd6823dafa5d0 - + https://github.com/dotnet/roslyn - 65df6b1065bae316232a6c9907a8be995302fb5e + 1aa759af23d2a29043ea44fcef5bd6823dafa5d0 - + https://github.com/dotnet/roslyn - 65df6b1065bae316232a6c9907a8be995302fb5e + 1aa759af23d2a29043ea44fcef5bd6823dafa5d0 - + https://github.com/dotnet/roslyn - 65df6b1065bae316232a6c9907a8be995302fb5e + 1aa759af23d2a29043ea44fcef5bd6823dafa5d0 diff --git a/eng/Versions.props b/eng/Versions.props index 220ee2860ed0..7b8db9029a7d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -146,10 +146,10 @@ 8.0.0-preview.7.23354.1 8.0.0-preview.7.23354.1 - 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.23314.3 + 4.7.0-3.23314.3 + 4.7.0-3.23314.3 + 4.7.0-3.23314.3 6.2.4 @@ -165,6 +165,8 @@ 8.0.0-alpha.1.23319.1 8.0.0-alpha.1.23326.1 + + 2.0.0-beta-23228-03 7.0.0-preview.22423.2 @@ -241,11 +243,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.23314.3 + 4.7.0-3.23314.3 + 4.7.0-3.23314.3 + 4.7.0-3.23314.3 + 4.7.0-3.23314.3 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..9c20abc6939c 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Resources.resx +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/Resources.resx @@ -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/Framework/AspNetCoreAnalyzers/test/RouteEmbeddedLanguage/FrameworkParametersCompletionProviderTests.cs b/src/Framework/AspNetCoreAnalyzers/test/RouteEmbeddedLanguage/FrameworkParametersCompletionProviderTests.cs index 703b952d6311..19102a919c8c 100644 --- a/src/Framework/AspNetCoreAnalyzers/test/RouteEmbeddedLanguage/FrameworkParametersCompletionProviderTests.cs +++ b/src/Framework/AspNetCoreAnalyzers/test/RouteEmbeddedLanguage/FrameworkParametersCompletionProviderTests.cs @@ -2,10 +2,12 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.AspNetCore.Analyzers.RouteEmbeddedLanguage.Infrastructure; +using Microsoft.AspNetCore.Testing; using Microsoft.CodeAnalysis.Completion; namespace Microsoft.AspNetCore.Analyzers.RouteEmbeddedLanguage; +[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/49126")] public partial class FrameworkParametersCompletionProviderTests { private TestDiagnosticAnalyzerRunner Runner { get; } = new(new RoutePatternAnalyzer()); diff --git a/src/Framework/AspNetCoreAnalyzers/test/RouteEmbeddedLanguage/RoutePatternCompletionProviderTests.cs b/src/Framework/AspNetCoreAnalyzers/test/RouteEmbeddedLanguage/RoutePatternCompletionProviderTests.cs index b59c7b3ec8a2..84259e41df44 100644 --- a/src/Framework/AspNetCoreAnalyzers/test/RouteEmbeddedLanguage/RoutePatternCompletionProviderTests.cs +++ b/src/Framework/AspNetCoreAnalyzers/test/RouteEmbeddedLanguage/RoutePatternCompletionProviderTests.cs @@ -3,11 +3,13 @@ using System.Text; using Microsoft.AspNetCore.Analyzers.RouteEmbeddedLanguage.Infrastructure; +using Microsoft.AspNetCore.Testing; using Microsoft.CodeAnalysis.Completion; using Microsoft.CodeAnalysis.Text; namespace Microsoft.AspNetCore.Analyzers.RouteEmbeddedLanguage; +[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/49126")] public partial class RoutePatternCompletionProviderTests { private TestDiagnosticAnalyzerRunner Runner { get; } = new(new RoutePatternAnalyzer()); diff --git a/src/Http/Http.Extensions/gen/Microsoft.AspNetCore.Http.RequestDelegateGenerator.csproj b/src/Http/Http.Extensions/gen/Microsoft.AspNetCore.Http.RequestDelegateGenerator.csproj index 559b13e7a4b6..8cdd10691788 100644 --- a/src/Http/Http.Extensions/gen/Microsoft.AspNetCore.Http.RequestDelegateGenerator.csproj +++ b/src/Http/Http.Extensions/gen/Microsoft.AspNetCore.Http.RequestDelegateGenerator.csproj @@ -30,6 +30,7 @@ + diff --git a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs index 5d72d28ca39a..6be42421b9a8 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs @@ -8,7 +8,6 @@ using Microsoft.AspNetCore.Analyzers.Infrastructure; 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.CodeAnalysis.CSharp; @@ -26,10 +25,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { var operation = context.SemanticModel.GetOperation(context.Node, token); var wellKnownTypes = WellKnownTypes.GetOrCreate(context.SemanticModel.Compilation); - if (operation is IInvocationOperation invocationOperation && - invocationOperation.TryGetRouteHandlerArgument(out var routeHandlerParameter) && - routeHandlerParameter is { Parameter.Type: {} delegateType } && - SymbolEqualityComparer.Default.Equals(delegateType, wellKnownTypes.Get(WellKnownTypeData.WellKnownType.System_Delegate))) + if (operation.IsValidOperation(wellKnownTypes, out var invocationOperation)) { return new Endpoint(invocationOperation, wellKnownTypes, context.SemanticModel); } @@ -55,117 +51,104 @@ public void Initialize(IncrementalGeneratorInitializationContext context) .Where(endpoint => endpoint.Diagnostics.Count == 0) .WithTrackingName(GeneratorSteps.EndpointsWithoutDiagnosicsStep); - var thunks = endpoints.Select((endpoint, _) => - { - using var stringWriter = new StringWriter(CultureInfo.InvariantCulture); - using var codeWriter = new CodeWriter(stringWriter, baseIndent: 3); - codeWriter.InitializeIndent(); - codeWriter.WriteLine($"[{endpoint.EmitSourceKey()}] = ("); - codeWriter.Indent++; - codeWriter.WriteLine("(methodInfo, options) =>"); - codeWriter.StartBlock(); - codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");"); - codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");"); - codeWriter.WriteLine($"options.EndpointBuilder.Metadata.Add(new SourceKey{endpoint.EmitSourceKey()});"); - endpoint.EmitEndpointMetadataPopulation(codeWriter); - codeWriter.WriteLine("return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };"); - codeWriter.EndBlockWithComma(); - codeWriter.WriteLine("(del, options, inferredMetadataResult) =>"); - codeWriter.StartBlock(); - codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");"); - codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");"); - codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.ApplicationServices != null, ""ApplicationServices not found."");"); - codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.FilterFactories != null, ""FilterFactories not found."");"); - codeWriter.WriteLine($"var handler = ({endpoint.EmitHandlerDelegateType(considerOptionality: true)})del;"); - codeWriter.WriteLine("EndpointFilterDelegate? filteredInvocation = null;"); - codeWriter.WriteLine("var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;"); - endpoint.EmitLoggingPreamble(codeWriter); - endpoint.EmitJsonPreparation(codeWriter); - endpoint.EmitRouteOrQueryResolver(codeWriter); - endpoint.EmitJsonBodyOrServiceResolver(codeWriter); - if (endpoint.NeedsParameterArray) + var interceptorDefinitions = endpoints + .GroupWith((endpoint) => endpoint.Location, EndpointDelegateComparer.Instance) + .Select((endpointWithLocations, _) => { - 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(); - }); - - var stronglyTypedEndpointDefinitions = endpoints - .Collect() - .Select((endpoints, _) => - { - var dedupedByDelegate = endpoints.Distinct(EndpointDelegateComparer.Instance); + var endpoint = endpointWithLocations.Source; using var stringWriter = new StringWriter(CultureInfo.InvariantCulture); using var codeWriter = new CodeWriter(stringWriter, baseIndent: 2); - foreach (var endpoint in dedupedByDelegate) + foreach (var location in endpointWithLocations.Elements) { - codeWriter.WriteLine($"internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder {endpoint.HttpMethod}("); - codeWriter.Indent++; - codeWriter.WriteLine("this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,"); - // MapFallback overloads that only take a delegate do not need a pattern argument - if (endpoint.HttpMethod != "MapFallback" || endpoint.Operation.Arguments.Length != 2) - { - codeWriter.WriteLine(@"[global::System.Diagnostics.CodeAnalysis.StringSyntax(""Route"")] string pattern,"); - } - // MapMethods overloads define an additional `httpMethods` parameter - if (endpoint.HttpMethod == "MapMethods") - { - codeWriter.WriteLine("global::System.Collections.Generic.IEnumerable httpMethods,"); - } - codeWriter.WriteLine($"global::{endpoint.EmitHandlerDelegateType()} handler,"); - codeWriter.WriteLine(@"[global::System.Runtime.CompilerServices.CallerFilePath] string filePath = """","); - codeWriter.WriteLine("[global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)"); - codeWriter.Indent--; - codeWriter.StartBlock(); - codeWriter.WriteLine("return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore("); - codeWriter.Indent++; - codeWriter.WriteLine("endpoints,"); - // For `MapFallback` overloads that only take a delegate, provide the assumed default - // Otherwise, pass the pattern provided from the MapX invocation - if (endpoint.HttpMethod != "MapFallback" && endpoint.Operation.Arguments.Length != 2) - { - codeWriter.WriteLine("pattern,"); - } - else - { - codeWriter.WriteLine($"{SymbolDisplay.FormatLiteral("{*path:nonfile}", true)},"); - } - codeWriter.WriteLine("handler,"); - codeWriter.WriteLine($"{endpoint.EmitVerb()},"); - codeWriter.WriteLine("filePath,"); - codeWriter.WriteLine("lineNumber);"); - codeWriter.Indent--; - codeWriter.EndBlock(); + codeWriter.WriteLine($$"""[InterceptsLocation(@"{{location.File}}", {{location.LineNumber}}, {{location.CharacterNumber}})]"""); } - + codeWriter.WriteLine($"internal static RouteHandlerBuilder {endpoint.HttpMethod}_{endpoint.Location.LineNumber}{endpoint.Location.CharacterNumber}("); + codeWriter.Indent++; + codeWriter.WriteLine("this 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(@"[System.Diagnostics.CodeAnalysis.StringSyntax(""Route"")] string pattern,"); + } + // MapMethods overloads define an additional `httpMethods` parameter + if (endpoint.HttpMethod == "MapMethods") + { + codeWriter.WriteLine("System.Collections.Generic.IEnumerable httpMethods,"); + } + codeWriter.WriteLine("System.Delegate handler)"); + codeWriter.Indent--; + codeWriter.StartBlock(); + codeWriter.WriteLine("MetadataPopulator populateMetadata = (methodInfo, options) =>"); + codeWriter.StartBlock(); + codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");"); + codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");"); + codeWriter.WriteLine($"options.EndpointBuilder.Metadata.Add(new {RequestDelegateGeneratorSources.GeneratedCodeConstructor});"); + endpoint.EmitEndpointMetadataPopulation(codeWriter); + codeWriter.WriteLine("return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };"); + codeWriter.EndBlockWithSemicolon(); + codeWriter.WriteLine("RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>"); + codeWriter.StartBlock(); + codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");"); + codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");"); + codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.ApplicationServices != null, ""ApplicationServices not found."");"); + codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.FilterFactories != null, ""FilterFactories not found."");"); + codeWriter.WriteLine($"var handler = Cast(del, {endpoint.EmitHandlerDelegateType(considerOptionality: true)} => throw null!);"); + codeWriter.WriteLine("EndpointFilterDelegate? filteredInvocation = null;"); + codeWriter.WriteLine("var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;"); + endpoint.EmitLoggingPreamble(codeWriter); + endpoint.EmitJsonPreparation(codeWriter); + endpoint.EmitRouteOrQueryResolver(codeWriter); + endpoint.EmitJsonBodyOrServiceResolver(codeWriter); + if (endpoint.NeedsParameterArray) + { + codeWriter.WriteLine("var parameters = del.Method.GetParameters();"); + } + codeWriter.WriteLineNoTabs(string.Empty); + codeWriter.WriteLine("if (options.EndpointBuilder.FilterFactories.Count > 0)"); + codeWriter.StartBlock(); + codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true + ? "filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic =>" + : "filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>"); + codeWriter.StartBlock(); + codeWriter.WriteLine("if (ic.HttpContext.Response.StatusCode == 400)"); + codeWriter.StartBlock(); + codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true + ? "return (object?)Results.Empty;" + : "return ValueTask.FromResult(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.EndBlockWithSemicolon(); + 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("populateMetadata,"); + codeWriter.WriteLine("createRequestDelegate);"); + codeWriter.Indent--; + codeWriter.EndBlock(); return stringWriter.ToString(); }); @@ -270,27 +253,22 @@ public void Initialize(IncrementalGeneratorInitializationContext context) return stringWriter.ToString(); }); - var thunksAndEndpoints = thunks.Collect().Combine(stronglyTypedEndpointDefinitions).Combine(endpointHelpers).Combine(helperTypes); + var endpointsAndHelpers = interceptorDefinitions.Collect().Combine(endpointHelpers).Combine(helperTypes); - context.RegisterSourceOutput(thunksAndEndpoints, (context, sources) => + context.RegisterSourceOutput(endpointsAndHelpers, (context, sources) => { - var (((thunks, endpointsCode), helperMethods), helperTypes) = sources; - - if (thunks.IsDefaultOrEmpty || string.IsNullOrEmpty(endpointsCode)) + var ((endpointsCode, helperMethods), helperTypes) = sources; + if (endpointsCode.IsDefaultOrEmpty) { return; } - - var thunksCode = new StringBuilder(); - foreach (var thunk in thunks) + var endpoints = new StringBuilder(); + foreach (var endpoint in endpointsCode) { - thunksCode.AppendLine(thunk); + endpoints.AppendLine(endpoint); } - 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 2437c4ed109f..ceb0dff38768 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs @@ -18,7 +18,8 @@ internal static class RequestDelegateGeneratorSources #nullable enable """; - public static string GeneratedCodeAttribute => $@"[System.CodeDom.Compiler.GeneratedCodeAttribute(""{typeof(RequestDelegateGeneratorSources).Assembly.FullName}"", ""{typeof(RequestDelegateGeneratorSources).Assembly.GetName().Version}"")]"; + public static string GeneratedCodeConstructor => $@"System.CodeDom.Compiler.GeneratedCodeAttribute(""{typeof(RequestDelegateGeneratorSources).Assembly.FullName}"", ""{typeof(RequestDelegateGeneratorSources).Assembly.GetName().Version}"")"; + public static string GeneratedCodeAttribute => $"[{GeneratedCodeConstructor}]"; public static string ContentTypeConstantsType => $$""" {{GeneratedCodeAttribute}} @@ -485,25 +486,19 @@ 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 +namespace System.Runtime.CompilerServices { {{GeneratedCodeAttribute}} - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - -{{GetEndpoints(endpoints)}} } namespace Microsoft.AspNetCore.Http.Generated @@ -517,6 +512,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; @@ -539,8 +535,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) { @@ -603,63 +620,4 @@ private static bool ShouldUseWith(this JsonTypeInfo jsonTypeInfo, [NotNullWhen(f {{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/RequestDelegateGeneratorSuppressor.cs b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSuppressor.cs new file mode 100644 index 000000000000..cbde9e7e4373 --- /dev/null +++ b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSuppressor.cs @@ -0,0 +1,74 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Immutable; +using System.Linq; +using Microsoft.AspNetCore.App.Analyzers.Infrastructure; +using Microsoft.AspNetCore.Http.RequestDelegateGenerator.StaticRouteHandlerModel; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Operations; + +/* + * This class contains the logic for suppressing diagnostics that are + * emitted by the linker analyzers when encountering the framework-provided + * `Map` invocations. Pending the completion of https://github.com/dotnet/roslyn/issues/68669, + * this workaround is necessary to apply these suppressions for `Map` invocations that the RDG + * is able to generate code at compile time for that the analyzer is not able to resolve. + */ + +namespace Microsoft.AspNetCore.Http.RequestDelegateGenerator; + +[DiagnosticAnalyzer(LanguageNames.CSharp)] +public sealed class RequestDelegateGeneratorSuppressor : DiagnosticSuppressor +{ + private static readonly SuppressionDescriptor SuppressRUCDiagnostic = new( + id: "RDGS001", + suppressedDiagnosticId: "IL2026", + justification: "The target method has been intercepted by a statically generated variant."); + + private static readonly SuppressionDescriptor SuppressRDCDiagnostic = new( + id: "RDGS002", + suppressedDiagnosticId: "IL3050", + justification: "The target method has been intercepted by a statically generated variant."); + + public override void ReportSuppressions(SuppressionAnalysisContext context) + { + foreach (var diagnostic in context.ReportedDiagnostics) + { + if (diagnostic.Id != SuppressRDCDiagnostic.SuppressedDiagnosticId && diagnostic.Id != SuppressRUCDiagnostic.SuppressedDiagnosticId) + { + continue; + } + + var location = diagnostic.AdditionalLocations.Count > 0 + ? diagnostic.AdditionalLocations[0] + : diagnostic.Location; + + if (location.SourceTree is not { } sourceTree + || sourceTree.GetRoot().FindNode(location.SourceSpan) is not InvocationExpressionSyntax node + || !node.TryGetMapMethodName(out var method) + || !InvocationOperationExtensions.KnownMethods.Contains(method)) + { + continue; + } + + var semanticModel = context.GetSemanticModel(sourceTree); + var operation = semanticModel.GetOperation(node, context.CancellationToken); + var wellKnownTypes = WellKnownTypes.GetOrCreate(semanticModel.Compilation); + if (operation.IsValidOperation(wellKnownTypes, out var invocationOperation)) + { + var endpoint = new Endpoint(invocationOperation, wellKnownTypes, semanticModel); + if (endpoint.Diagnostics.Count == 0) + { + var targetSuppression = diagnostic.Id == SuppressRUCDiagnostic.SuppressedDiagnosticId + ? SuppressRUCDiagnostic + : SuppressRDCDiagnostic; + context.ReportSuppression(Suppression.Create(targetSuppression, diagnostic)); + } + } + } + } + public override ImmutableArray SupportedSuppressions => ImmutableArray.Create(SuppressRUCDiagnostic, SuppressRDCDiagnostic); +} diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Endpoint.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Endpoint.cs index f624ca3ddd78..59f80a480e79 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Endpoint.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Endpoint.cs @@ -95,7 +95,7 @@ public Endpoint(IInvocationOperation operation, WellKnownTypes wellKnownTypes, S 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) => @@ -138,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 filePath = operation.Syntax.SyntaxTree.GetInterceptorFilePath(operation.SemanticModel?.Compilation.Options.SourceReferenceResolver); var span = operation.Syntax.SyntaxTree.GetLineSpan(operationSpan); var lineNumber = span.StartLinePosition.Line + 1; - return (filePath, lineNumber); + // Calculate the character offset to the end of the Map invocation detected + var invocationLength = ((MemberAccessExpressionSyntax)((InvocationExpressionSyntax)operation.Syntax).Expression).Expression.Span.Length; + var characterNumber = span.StartLinePosition.Character + invocationLength + 2; + return (filePath, lineNumber, characterNumber); } private static string GetHttpMethod(IInvocationOperation operation) diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs index bd2aee82f3b1..55f19a1fc4e4 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs @@ -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; } @@ -610,17 +613,17 @@ obj is EndpointParameter other && other.SymbolName == SymbolName && other.Ordinal == Ordinal && other.IsOptional == IsOptional && - SymbolEqualityComparer.Default.Equals(other.Type, Type); + SymbolEqualityComparer.IncludeNullability.Equals(other.Type, Type); public bool SignatureEquals(object obj) => obj is EndpointParameter other && - SymbolEqualityComparer.Default.Equals(other.Type, Type); + SymbolEqualityComparer.IncludeNullability.Equals(other.Type, Type); public override int GetHashCode() { var hashCode = new HashCode(); hashCode.Add(SymbolName); - hashCode.Add(Type, SymbolEqualityComparer.Default); + hashCode.Add(Type, SymbolEqualityComparer.IncludeNullability); return hashCode.ToHashCode(); } } diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/InvocationOperationExtensions.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/InvocationOperationExtensions.cs index 8907d10c778d..88af1ffae722 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/InvocationOperationExtensions.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/InvocationOperationExtensions.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.App.Analyzers.Infrastructure; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Operations; @@ -22,6 +23,20 @@ internal static class InvocationOperationExtensions "MapFallback" }; + public static bool IsValidOperation(this IOperation? operation, WellKnownTypes wellKnownTypes, [NotNullWhen(true)] out IInvocationOperation? invocationOperation) + { + invocationOperation = null; + if (operation is IInvocationOperation targetOperation && + targetOperation.TryGetRouteHandlerArgument(out var routeHandlerParameter) && + routeHandlerParameter is { Parameter.Type: {} delegateType } && + SymbolEqualityComparer.Default.Equals(delegateType, wellKnownTypes.Get(WellKnownTypeData.WellKnownType.System_Delegate))) + { + invocationOperation = targetOperation; + return true; + } + return false; + } + public static bool TryGetRouteHandlerMethod(this IInvocationOperation invocation, SemanticModel semanticModel, [NotNullWhen(true)] out IMethodSymbol? method) { method = null; diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs index b7c4cc00a75f..b19a81cbff79 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/StaticRouteHandlerModel.Emitter.cs @@ -14,19 +14,29 @@ internal static class StaticRouteHandlerModelEmitter { public static string EmitHandlerDelegateType(this Endpoint endpoint, bool considerOptionality = false) { + // Emits a delegate type to use when casting the input that captures + // default parameter values. + // + // void (int arg0, Todo arg1) => throw null! + // IResult (int arg0, Todo arg1) => throw null! if (endpoint.Parameters.Length == 0) { - return endpoint.Response == null || (endpoint.Response.HasNoResponse && !endpoint.Response.IsAwaitable) ? "System.Action" : $"System.Func<{endpoint.Response.WrappedResponseType}>"; + return endpoint.Response == null || (endpoint.Response.HasNoResponse && !endpoint.Response.IsAwaitable) ? "void ()" : $"{endpoint.Response.WrappedResponseType} ()"; } - var parameterTypeList = string.Join(", ", endpoint.Parameters.Select(p => considerOptionality - ? p.Type.ToDisplayString(p.IsOptional ? NullableFlowState.MaybeNull : NullableFlowState.NotNull, EmitterConstants.DisplayFormat) - : p.Type.ToDisplayString(EmitterConstants.DisplayFormat))); + var parameterTypeList = string.Join(", ", endpoint.Parameters.Select((p, i) => $"{getType(p, considerOptionality)} arg{i}{(p.HasDefaultValue ? $"= {p.DefaultValue}" : string.Empty)}")); if (endpoint.Response == null || (endpoint.Response.HasNoResponse && !endpoint.Response.IsAwaitable)) { - return $"System.Action<{parameterTypeList}>"; + return $"void ({parameterTypeList})"; + } + return $"{endpoint.Response.WrappedResponseType} ({parameterTypeList})"; + + static string getType(EndpointParameter p, bool considerOptionality) + { + return considerOptionality + ? p.Type.ToDisplayString(p.IsOptional ? NullableFlowState.MaybeNull : NullableFlowState.NotNull, EmitterConstants.DisplayFormat) + : p.Type.ToDisplayString(EmitterConstants.DisplayFormat); } - return $"System.Func<{parameterTypeList}, {endpoint.Response.WrappedResponseType}>"; } public static string EmitSourceKey(this Endpoint endpoint) 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 8a8bb612fbca..e80b1aad5ac7 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 @@ -8,2222 +8,2188 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } +} + +namespace Microsoft.AspNetCore.Http.Generated +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using System.Globalization; + using System.Linq; + using System.Reflection; + using System.Runtime.CompilerServices; + using System.Text.Json; + using System.Text.Json.Serialization.Metadata; + using System.Threading.Tasks; + using System.IO; + using Microsoft.AspNetCore.Routing; + using Microsoft.AspNetCore.Routing.Patterns; + using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Http; + using Microsoft.AspNetCore.Http.Json; + using Microsoft.AspNetCore.Http.Metadata; + using Microsoft.Extensions.DependencyInjection; + using Microsoft.Extensions.FileProviders; + using Microsoft.Extensions.Logging; + using Microsoft.Extensions.Primitives; + using Microsoft.Extensions.Options; + + using MetadataPopulator = System.Func; + using RequestDelegateFactoryFunc = System.Func; - // 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 + file static class GeneratedRouteBuilderExtensionsCore { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - private static readonly 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) + 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(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) + { + 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; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( endpoints, pattern, handler, GetVerb, - filePath, - lineNumber); + populateMetadata, + createRequestDelegate); } - 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) + +[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet_265( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?)myBindAsyncParam_temp; + + 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.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)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( endpoints, pattern, handler, GetVerb, - filePath, - lineNumber); + populateMetadata, + createRequestDelegate); } - 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) + +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet_275( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(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; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.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)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( endpoints, pattern, handler, GetVerb, - filePath, - lineNumber); + populateMetadata, + createRequestDelegate); } - 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) + +[InterceptsLocation(@"TestMapActions.cs", 28, 5)] + internal static RouteHandlerBuilder MapGet_285( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + 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)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( endpoints, pattern, handler, GetVerb, - filePath, - lineNumber); + populateMetadata, + createRequestDelegate); } - 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) + +[InterceptsLocation(@"TestMapActions.cs", 29, 5)] + internal static RouteHandlerBuilder MapGet_295( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(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; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( endpoints, pattern, handler, GetVerb, - filePath, - lineNumber); + populateMetadata, + createRequestDelegate); } - 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) + +[InterceptsLocation(@"TestMapActions.cs", 30, 5)] + internal static RouteHandlerBuilder MapGet_305( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + 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; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( endpoints, pattern, handler, GetVerb, - filePath, - lineNumber); + populateMetadata, + createRequestDelegate); } - 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) + +[InterceptsLocation(@"TestMapActions.cs", 31, 5)] + internal static RouteHandlerBuilder MapGet_315( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(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 + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + 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)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( endpoints, pattern, handler, GetVerb, - filePath, - lineNumber); + populateMetadata, + createRequestDelegate); } - 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) + +[InterceptsLocation(@"TestMapActions.cs", 32, 5)] + internal static RouteHandlerBuilder MapGet_325( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( endpoints, pattern, handler, GetVerb, - filePath, - lineNumber); + populateMetadata, + createRequestDelegate); } - } -} - -namespace Microsoft.AspNetCore.Http.Generated -{ - using System; - using System.Collections; - using System.Collections.Generic; - using System.Collections.ObjectModel; - using System.Diagnostics; - using System.Diagnostics.CodeAnalysis; - using System.Globalization; - using System.Linq; - using System.Reflection; - using System.Text.Json; - using System.Text.Json.Serialization.Metadata; - using System.Threading.Tasks; - using System.IO; - using Microsoft.AspNetCore.Routing; - using Microsoft.AspNetCore.Routing.Patterns; - using Microsoft.AspNetCore.Builder; - using Microsoft.AspNetCore.Http; - using Microsoft.AspNetCore.Http.Json; - using Microsoft.AspNetCore.Http.Metadata; - using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.FileProviders; - using Microsoft.Extensions.Logging; - using Microsoft.Extensions.Primitives; - using Microsoft.Extensions.Options; - - using MetadataPopulator = System.Func; - using RequestDelegateFactoryFunc = System.Func; - - %GENERATEDCODEATTRIBUTE% - file static class GeneratedRouteBuilderExtensionsCore - { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() +[InterceptsLocation(@"TestMapActions.cs", 33, 5)] + internal static RouteHandlerBuilder MapGet_335( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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 + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - 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; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.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!; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + else { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[1]); - global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncRecord", "myBindAsyncParam", "MyBindAsyncRecord.BindAsync(HttpContext, ParameterInfo)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord)myBindAsyncParam_temp; - } + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord)myBindAsyncParam_temp; + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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!; } - - 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.MySimpleBindAsyncRecord)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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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) => + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 34, 5)] + internal static RouteHandlerBuilder MapGet_345( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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 + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - 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; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + 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 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; - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 35, 5)] + internal static RouteHandlerBuilder MapGet_355( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return ValueTask.FromResult(Results.Empty); } - } + 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", 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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.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!; } - - async Task RequestHandler(HttpContext httpContext) + else { - 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); + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp; } - async Task RequestHandlerFiltered(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; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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 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); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 36, 5)] + internal static RouteHandlerBuilder MapGet_365( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + 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)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 30)] = ( - (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", 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) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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.MySimpleBindAsyncStruct.BindAsync(httpContext); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?)myBindAsyncParam_temp; - async Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + httpContext.Response.StatusCode = 400; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 31)] = ( - (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() }; - }, - (del, options, inferredMetadataResult) => + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 37, 5)] + internal static RouteHandlerBuilder MapGet_375( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await 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!; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + else { - 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; - } + 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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 32)] = ( - (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", 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) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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.BindAsyncFromImplicitStaticAbstractInterface myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromImplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromImplicitStaticAbstractInterface.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.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); + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface)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; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 33)] = ( - (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() }; - }, - (del, options, inferredMetadataResult) => + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 38, 5)] + internal static RouteHandlerBuilder MapGet_385( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - 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); - } + 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; - 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; - } - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 34)] = ( - (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", 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) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - 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 BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?)myBindAsyncParam_temp; - async Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp; + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - 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 global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 39, 5)] + internal static RouteHandlerBuilder MapGet_395( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + return ValueTask.FromResult(Results.Empty); } - await httpContext.Response.WriteAsync(result); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + 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) { - 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; + logOrThrowExceptionHelper.RequiredParameterNotProvided("InheritBindAsync", "myBindAsyncParam", "InheritBindAsync.BindAsync(HttpContext)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp; + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - 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 - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)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)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 40, 5)] + internal static RouteHandlerBuilder MapGet_405( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + 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!; - } - else - { - 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; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 36)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 36)); - options.EndpointBuilder.Metadata.Add(new 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - 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 global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + httpContext.Response.StatusCode = 400; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) { - 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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 37)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 37)); - options.EndpointBuilder.Metadata.Add(new 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 global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 41, 5)] + internal static RouteHandlerBuilder MapGet_415( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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 + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + 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)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await 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!; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + else { - 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; - } + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface)myBindAsyncParam_temp; + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 38)] = ( - (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() }; - }, - (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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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!; } - - 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.BindAsyncFromImplicitStaticAbstractInterface?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface)myBindAsyncParam_temp; } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await BindAsync(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 39)] = ( - (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() }; - }, - (del, options, inferredMetadataResult) => + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 42, 5)] + internal static RouteHandlerBuilder MapGet_425( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var parameters = del.Method.GetParameters(); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - 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 + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + 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)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); - } + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?)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.InheritBindAsync.BindAsync(httpContext); - global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("InheritBindAsync", "myBindAsyncParam", "InheritBindAsync.BindAsync(HttpContext)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp; - } - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 40)] = ( - (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() }; - }, - (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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - 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 BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface?)myBindAsyncParam_temp; - async Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + httpContext.Response.StatusCode = 400; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 41)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 41)); - options.EndpointBuilder.Metadata.Add(new 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 global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 43, 5)] + internal static RouteHandlerBuilder MapGet_435( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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 + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + 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; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync.BindAsync(httpContext); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncFromInterfaceRecord", "myBindAsyncParam", "MyBindAsyncFromInterfaceRecord.BindAsync(HttpContext)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + else { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await BindAsync(httpContext, parameters[1]); - global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromExplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromExplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface)myBindAsyncParam_temp; - } + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord)myBindAsyncParam_temp; + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var parameters = del.Method.GetParameters(); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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) => + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 44, 5)] + internal static RouteHandlerBuilder MapGet_445( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - 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 + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + 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; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); - } + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync.BindAsync(httpContext); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord?)myBindAsyncParam_temp; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.IBindAsync.BindAsync(httpContext); - global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncFromInterfaceRecord", "myBindAsyncParam", "MyBindAsyncFromInterfaceRecord.BindAsync(HttpContext)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord)myBindAsyncParam_temp; - } - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - 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; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) { - 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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 d2a12e7a731d..3857c424078b 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - PostVerb, - filePath, - lineNumber); } - } } @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,192 +54,226 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::Microsoft.AspNetCore.Http.HttpResults.Ok (global::Microsoft.AspNetCore.Http.Generators.Tests.Todo arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var todo_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func>)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var todo_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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 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", todo_JsonTypeInfo); + var todo_local = todo_resolveBodyResult.Item2; + if (!todo_resolveBodyResult.Item1) + { + return; } - async Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBody) - var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo", todo_JsonTypeInfo); - var todo_local = todo_resolveBodyResult.Item2; - if (!todo_resolveBodyResult.Item1) - { - return; - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(todo_local!); + await GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(todo_local!); - await GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext); + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBody) + var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo", todo_JsonTypeInfo); + var todo_local = todo_resolveBodyResult.Item2; + if (!todo_resolveBodyResult.Item1) + { + return; } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBody) - var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "Todo", "todo", todo_JsonTypeInfo); - var todo_local = todo_resolveBodyResult.Item2; - if (!todo_resolveBodyResult.Item1) - { - return; - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local!)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local!)); - if (result is not null) + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapPost_275( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::Microsoft.AspNetCore.Http.HttpResults.Ok (global::Microsoft.AspNetCore.Http.Generators.Tests.Todo? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var todo_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return ValueTask.FromResult(Results.Empty); } - } + 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) => + 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var todo_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo?, IsOptional = True, IsParsable = False, IsArray = False, Source = JsonBody) + var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo", todo_JsonTypeInfo); + var todo_local = todo_resolveBodyResult.Item2; + if (!todo_resolveBodyResult.Item1) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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", todo_JsonTypeInfo); - var todo_local = todo_resolveBodyResult.Item2; - if (!todo_resolveBodyResult.Item1) - { - return; - } - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(todo_local); - await GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext); + httpContext.Response.StatusCode = 400; + return; } + var result = handler(todo_local); + await GeneratedRouteBuilderExtensionsCore.ExecuteAsyncExplicit(result, httpContext); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo?, IsOptional = True, IsParsable = False, IsArray = False, Source = JsonBody) + var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo", todo_JsonTypeInfo); + var todo_local = todo_resolveBodyResult.Item2; + if (!todo_resolveBodyResult.Item1) { - var wasParamCheckFailure = false; - // Endpoint Parameter: todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.Todo?, IsOptional = True, IsParsable = False, IsArray = False, Source = JsonBody) - var todo_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, true, "Todo?", "todo", todo_JsonTypeInfo); - var todo_local = todo_resolveBodyResult.Item2; - if (!todo_resolveBodyResult.Item1) - { - return; - } + return; + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 c60152fe5b0e..1036333cee8f 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,127 +54,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 MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::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, global::System.Int32 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Header) + var p_raw = httpContext.Request.Headers["p"]; + var p_temp = p_raw.ToArray(); + global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; + for (var i = 0; i < p_temp.Length; i++) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Header) - var p_raw = httpContext.Request.Headers["p"]; - var p_temp = p_raw.ToArray(); - global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; - for (var i = 0; i < p_temp.Length; i++) + var element = p_temp[i]; + if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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, responseJsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Header) + var p_raw = httpContext.Request.Headers["p"]; + var p_temp = p_raw.ToArray(); + global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; + for (var i = 0; i < p_temp.Length; i++) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Header) - var p_raw = httpContext.Request.Headers["p"]; - var p_temp = p_raw.ToArray(); - global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; - for (var i = 0; i < p_temp.Length; i++) + var element = p_temp[i]; + if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 3be735b740d1..7f1c9d547f08 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,101 +54,121 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::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, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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 = Header) - var p_raw = httpContext.Request.Headers["p"]; - var p_temp = p_raw.ToArray(); - string[] p_local = p_temp!; + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header) + var p_raw = httpContext.Request.Headers["p"]; + var p_temp = p_raw.ToArray(); + string[] p_local = p_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(p_local); - return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header) - var p_raw = httpContext.Request.Headers["p"]; - var p_temp = p_raw.ToArray(); - string[] p_local = p_temp!; + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header) + var p_raw = httpContext.Request.Headers["p"]; + var p_temp = p_raw.ToArray(); + string[] p_local = p_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 f47bf6f57050..72735ca121b8 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,101 +54,121 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::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, global::System.Int32 (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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 = Header) - var p_raw = httpContext.Request.Headers["p"]; - var p_temp = p_raw.ToArray(); - string[] p_local = p_temp!; + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header) + var p_raw = httpContext.Request.Headers["p"]; + var p_temp = p_raw.ToArray(); + string[] p_local = p_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(p_local); - return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header) - var p_raw = httpContext.Request.Headers["p"]; - var p_temp = p_raw.ToArray(); - string[] p_local = p_temp!; + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Header) + var p_raw = httpContext.Request.Headers["p"]; + var p_temp = p_raw.ToArray(); + string[] p_local = p_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 d5418e942a09..779a5eb50238 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,127 +54,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 MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::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, global::System.Int32 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + var p_temp = p_raw.ToArray(); + global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; + for (var i = 0; i < p_temp.Length; i++) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Query) - var p_raw = httpContext.Request.Query["p"]; - var p_temp = p_raw.ToArray(); - global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; - for (var i = 0; i < p_temp.Length; i++) + var element = p_temp[i]; + if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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, responseJsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + var p_temp = p_raw.ToArray(); + global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; + for (var i = 0; i < p_temp.Length; i++) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = Query) - var p_raw = httpContext.Request.Query["p"]; - var p_temp = p_raw.ToArray(); - global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; - for (var i = 0; i < p_temp.Length; i++) + var element = p_temp[i]; + if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 53967a29718b..6de7c0b87145 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,100 +54,120 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::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, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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!; + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + var p_temp = p_raw.ToArray(); + string[] p_local = p_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(p_local); - return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query) - var p_raw = httpContext.Request.Query["p"]; - var p_temp = p_raw.ToArray(); - string[] p_local = p_temp!; + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + var p_temp = p_raw.ToArray(); + string[] p_local = p_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 523dc1545b30..bcea2ea3a4df 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,100 +54,120 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::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, global::System.Int32 (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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!; + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + var p_temp = p_raw.ToArray(); + string[] p_local = p_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(p_local); - return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local); + return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query) - var p_raw = httpContext.Request.Query["p"]; - var p_temp = p_raw.ToArray(); - string[] p_local = p_temp!; + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + var p_temp = p_raw.ToArray(); + string[] p_local = p_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 632e473acd76..197f766f419a 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 @@ -8,82 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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) - { - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -97,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -119,268 +54,316 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TestService arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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(); + 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(); - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(svc_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = handler(svc_local); + if (result is string) { - var wasParamCheckFailure = false; - // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) - var svc_local = httpContext.RequestServices.GetRequiredService(); - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, svc_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + return httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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, global::System.String>)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) + var svc_local = httpContext.RequestServices.GetRequiredService(); + + 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; } - - Task RequestHandler(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, svc_local)); + if (result is not null) { - 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); + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - 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>(); + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create>(httpContext, svc_local)); - if (result is not null) +[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet_265( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.Collections.Generic.IEnumerable arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return ValueTask.FromResult(Results.Empty); } - } + 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 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, global::System.String>)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - 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; + return Task.CompletedTask; + } + var result = handler(svc_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + return httpContext.Response.WriteAsync(result); + } - Task RequestHandler(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: svc (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) + var svc_local = httpContext.RequestServices.GetRequiredService>(); + + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService?, IsOptional = True, IsParsable = False, IsArray = False, Source = Service) - var svc_local = httpContext.RequestServices.GetService();; - // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) - var svcs_local = httpContext.RequestServices.GetRequiredService>(); + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create>(httpContext, svc_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(svc_local, svcs_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet_275( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TestService? arg0, global::System.Collections.Generic.IEnumerable arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + return ValueTask.FromResult(Results.Empty); } - return httpContext.Response.WriteAsync(result); - } + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument>(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService?, IsOptional = True, IsParsable = False, IsArray = False, Source = Service) + var svc_local = httpContext.RequestServices.GetService();; + // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) + var svcs_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 = 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.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(svc_local, svcs_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + return httpContext.Response.WriteAsync(result); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create>(httpContext, svc_local, svcs_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService?, IsOptional = True, IsParsable = False, IsArray = False, Source = Service) + var svc_local = httpContext.RequestServices.GetService();; + // 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)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 13ba3ce3131c..f69171676415 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,504 +54,142 @@ 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)] + [InterceptsLocation(@"TestMapActions.cs", 26, 5)] + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] + [InterceptsLocation(@"TestMapActions.cs", 28, 5)] + [InterceptsLocation(@"TestMapActions.cs", 29, 5)] + internal static RouteHandlerBuilder MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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)) - { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "queryValue", "query string"); - } - var queryValue_temp = (string?)queryValue_raw; - string queryValue_local = queryValue_temp!; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(queryValue_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); - } - - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: queryValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query) - var queryValue_raw = httpContext.Request.Query["queryValue"]; - if (StringValues.IsNullOrEmpty(queryValue_raw)) - { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "queryValue", "query string"); - } - var queryValue_temp = (string?)queryValue_raw; - string queryValue_local = queryValue_temp!; - - if (wasParamCheckFailure) + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; + return ValueTask.FromResult(Results.Empty); } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, queryValue_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } - } + 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", 26)] = ( - (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", 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; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: queryValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query) + var queryValue_raw = httpContext.Request.Query["queryValue"]; + if (StringValues.IsNullOrEmpty(queryValue_raw)) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "queryValue", "query string"); } + var queryValue_temp = (string?)queryValue_raw; + string queryValue_local = queryValue_temp!; - Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: headerValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Header) - var headerValue_raw = httpContext.Request.Headers["headerValue"]; - if (StringValues.IsNullOrEmpty(headerValue_raw)) - { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "headerValue", "header"); - } - var headerValue_temp = (string?)headerValue_raw; - string headerValue_local = headerValue_temp!; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(headerValue_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = handler(queryValue_local); + if (result is string) { - var wasParamCheckFailure = false; - // Endpoint Parameter: headerValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Header) - var headerValue_raw = httpContext.Request.Headers["headerValue"]; - if (StringValues.IsNullOrEmpty(headerValue_raw)) - { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "headerValue", "header"); - } - var headerValue_temp = (string?)headerValue_raw; - string headerValue_local = headerValue_temp!; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, headerValue_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } - - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + else { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + return httpContext.Response.WriteAsync(result); + } - Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: routeValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Route) - if (options?.RouteParameterNames?.Contains("routeValue", StringComparer.OrdinalIgnoreCase) != true) - { - throw new InvalidOperationException($"'routeValue' is not a route parameter."); - } - var routeValue_raw = (string?)httpContext.Request.RouteValues["routeValue"]; - if (routeValue_raw == null) - { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "routeValue", "route"); - } - var routeValue_temp = (string?)routeValue_raw; - string routeValue_local = routeValue_temp!; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(routeValue_local!); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); - } - - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: routeValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Route) - if (options?.RouteParameterNames?.Contains("routeValue", StringComparer.OrdinalIgnoreCase) != true) - { - throw new InvalidOperationException($"'routeValue' is not a route parameter."); - } - var routeValue_raw = (string?)httpContext.Request.RouteValues["routeValue"]; - if (routeValue_raw == null) - { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "routeValue", "route"); - } - var routeValue_temp = (string?)routeValue_raw; - string routeValue_local = routeValue_temp!; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, routeValue_local!)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } - } - - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("value", options.RouteParameterNames); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + // Endpoint Parameter: queryValue (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = Query) + var queryValue_raw = httpContext.Request.Query["queryValue"]; + if (StringValues.IsNullOrEmpty(queryValue_raw)) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "queryValue", "query string"); } + var queryValue_temp = (string?)queryValue_raw; + string queryValue_local = queryValue_temp!; - Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: value (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery) - var value_raw = value_RouteOrQueryResolver(httpContext); - if (value_raw is StringValues { Count: 0 }) - { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "value", "route or query string"); - } - var value_temp = (string?)value_raw; - string value_local = value_temp!; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(value_local!); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); + httpContext.Response.StatusCode = 400; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, queryValue_local)); + if (result is not null) { - var wasParamCheckFailure = false; - // Endpoint Parameter: value (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery) - var value_raw = value_RouteOrQueryResolver(httpContext); - if (value_raw is StringValues { Count: 0 }) - { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "value", "route or query string"); - } - var value_temp = (string?)value_raw; - string value_local = value_temp!; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, value_local!)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("value", options.RouteParameterNames); - - if (options.EndpointBuilder.FilterFactories.Count > 0) - { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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!; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(value_local!); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); - } - - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: value (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery) - var value_raw = value_RouteOrQueryResolver(httpContext); - if (value_raw is StringValues { Count: 0 }) - { - wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "value", "route or query string"); - } - var value_temp = (string?)value_raw; - string value_local = value_temp!; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, value_local!)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } - } + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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; @@ -641,12 +244,6 @@ namespace Microsoft.AspNetCore.Http.Generated private static bool ShouldUseWith(this JsonTypeInfo jsonTypeInfo, [NotNullWhen(false)] Type? runtimeType) => runtimeType is null || jsonTypeInfo.Type == runtimeType || jsonTypeInfo.HasKnownPolymorphism(); - private static Func ResolveFromRouteOrQuery(string parameterName, IEnumerable? routeParameterNames) - { - return routeParameterNames?.Contains(parameterName, StringComparer.OrdinalIgnoreCase) == true - ? (httpContext) => new StringValues((string?)httpContext.Request.RouteValues[parameterName]) - : (httpContext) => httpContext.Request.Query[parameterName]; - } } 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 37043212e1e8..9dc6f531d65e 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,128 +54,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 MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::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, global::System.Int32 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var p_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("p", options.RouteParameterNames); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - var p_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("p", options.RouteParameterNames); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = RouteOrQuery) + var p_raw = p_RouteOrQueryResolver(httpContext); + var p_temp = p_raw.ToArray(); + global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; + for (var i = 0; i < p_temp.Length; i++) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = RouteOrQuery) - var p_raw = p_RouteOrQueryResolver(httpContext); - var p_temp = p_raw.ToArray(); - global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; - for (var i = 0; i < p_temp.Length; i++) + var element = p_temp[i]; + if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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, responseJsonTypeInfo); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(p_local!); + return httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = RouteOrQuery) + var p_raw = p_RouteOrQueryResolver(httpContext); + var p_temp = p_raw.ToArray(); + global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; + for (var i = 0; i < p_temp.Length; i++) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[], IsOptional = False, IsParsable = True, IsArray = True, Source = RouteOrQuery) - var p_raw = p_RouteOrQueryResolver(httpContext); - var p_temp = p_raw.ToArray(); - global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] p_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[p_temp.Length]; - for (var i = 0; i < p_temp.Length; i++) + var element = p_temp[i]; + if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(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!)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local!)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 93b7d2fca104..87756fd1cedb 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,140 +54,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 MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + 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() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - 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); - } - - async Task RequestHandler(HttpContext httpContext) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - 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) + if (ic.HttpContext.Response.StatusCode == 400) { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String?[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 93b7d2fca104..87756fd1cedb 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,140 +54,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 MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + 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() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - 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); - } - - async Task RequestHandler(HttpContext httpContext) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - 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) + if (ic.HttpContext.Response.StatusCode == 400) { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String?[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 93b7d2fca104..87756fd1cedb 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,140 +54,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 MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + 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() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - 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); - } - - async Task RequestHandler(HttpContext httpContext) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - 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) + if (ic.HttpContext.Response.StatusCode == 400) { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String?[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String?[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 a87fb6e6c78b..309e44ad6fd9 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,140 +54,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 MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + 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() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - 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); - } - - async Task RequestHandler(HttpContext httpContext) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - 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) + if (ic.HttpContext.Response.StatusCode == 400) { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 d3af08708f81..4a43ef501294 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - PostVerb, - filePath, - lineNumber); } - } } @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,145 +54,165 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)), + (false, typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.TestService)), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.Todo arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.TestService arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var serviceProviderIsService = serviceProvider?.GetService(); + var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "Todo", "todo", jsonOptions, serviceProviderIsService); + var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TestService", "svc", jsonOptions, serviceProviderIsService); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var serviceProviderIsService = serviceProvider?.GetService(); - var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "Todo", "todo", jsonOptions, serviceProviderIsService); - var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TestService", "svc", jsonOptions, serviceProviderIsService); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + 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!)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, todo_local!, svc_local!)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 5aabd491daf4..7a485dc092bd 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,103 +54,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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0, global::Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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; + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var req_local = httpContext.Request; + var res_local = httpContext.Response; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(req_local, res_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = handler(req_local, res_local); + if (result is string) { - var wasParamCheckFailure = false; - var req_local = httpContext.Request; - var res_local = httpContext.Response; + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + return httpContext.Response.WriteAsync(result); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, req_local, res_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var req_local = httpContext.Request; + var res_local = httpContext.Response; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, req_local, res_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 a6bd9a25c1f2..0b65e204a7a6 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,136 +54,156 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.String arg0, global::System.String arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + 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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p1_local, p2_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 6d5f87e12ba1..08791024fe18 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,97 +54,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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 6d5f87e12ba1..08791024fe18 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,97 +54,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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 ee2b514dbd9b..1a1dc3731484 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,90 +54,110 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new GeneratedProducesResponseTypeMetadata(type: typeof(global::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, global::Microsoft.AspNetCore.Http.Generators.Tests.Todo () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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.WriteJsonResponseAsync(httpContext.Response, result, responseJsonTypeInfo); + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } + var result = handler(); + return GeneratedRouteBuilderExtensionsCore.WriteJsonResponseAsync(httpContext.Response, result, responseJsonTypeInfo); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 1ebad46a894d..be5cbeb6ada6 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 @@ -8,52 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,89 +54,109 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + 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, global::Microsoft.AspNetCore.Http.HttpResults.ValidationProblem () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 8841906edc4f..cf63f02f2c3b 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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); } - } } @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,89 +54,109 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, void () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Action)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 51b47f945a40..b35762253ce9 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,134 +54,154 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, IsOptional = False, IsParsable = True, IsArray = False, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + if (StringValues.IsNullOrEmpty(p_raw)) + { + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("TryParseTodo", "p", "query string"); + } + var p_temp = (string?)p_raw; + if (!global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo.TryParse(p_temp!, out var p_parsed_temp)) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, IsOptional = False, IsParsable = True, IsArray = False, Source = Query) - var p_raw = httpContext.Request.Query["p"]; - if (StringValues.IsNullOrEmpty(p_raw)) + if (!string.IsNullOrEmpty(p_temp)) { + logOrThrowExceptionHelper.ParameterBindingFailed("TryParseTodo", "p", p_temp); wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("TryParseTodo", "p", "query string"); } - var p_temp = (string?)p_raw; - if (!global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo.TryParse(p_temp!, out var p_parsed_temp)) - { - if (!string.IsNullOrEmpty(p_temp)) - { - logOrThrowExceptionHelper.ParameterBindingFailed("TryParseTodo", "p", p_temp); - wasParamCheckFailure = true; - } - } - global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo p_local = p_parsed_temp!; + } + global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo p_local = p_parsed_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(p_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(p_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + return httpContext.Response.WriteAsync(result); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, IsOptional = False, IsParsable = True, IsArray = False, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + if (StringValues.IsNullOrEmpty(p_raw)) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo, IsOptional = False, IsParsable = True, IsArray = False, Source = Query) - var p_raw = httpContext.Request.Query["p"]; - if (StringValues.IsNullOrEmpty(p_raw)) + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("TryParseTodo", "p", "query string"); + } + var p_temp = (string?)p_raw; + if (!global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo.TryParse(p_temp!, out var p_parsed_temp)) + { + if (!string.IsNullOrEmpty(p_temp)) { + logOrThrowExceptionHelper.ParameterBindingFailed("TryParseTodo", "p", p_temp); wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("TryParseTodo", "p", "query string"); - } - var p_temp = (string?)p_raw; - if (!global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo.TryParse(p_temp!, out var p_parsed_temp)) - { - if (!string.IsNullOrEmpty(p_temp)) - { - logOrThrowExceptionHelper.ParameterBindingFailed("TryParseTodo", "p", p_temp); - wasParamCheckFailure = true; - } } - global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo p_local = p_parsed_temp!; + } + global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo p_local = p_parsed_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 9b99e61be5bb..6fe2dcaca5aa 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,134 +54,154 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus, IsOptional = False, IsParsable = True, IsArray = False, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + if (StringValues.IsNullOrEmpty(p_raw)) + { + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("TodoStatus", "p", "query string"); + } + var p_temp = (string?)p_raw; + if (!Enum.TryParse(p_temp!, out var p_parsed_temp)) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus, IsOptional = False, IsParsable = True, IsArray = False, Source = Query) - var p_raw = httpContext.Request.Query["p"]; - if (StringValues.IsNullOrEmpty(p_raw)) + if (!string.IsNullOrEmpty(p_temp)) { + logOrThrowExceptionHelper.ParameterBindingFailed("TodoStatus", "p", p_temp); wasParamCheckFailure = true; - logOrThrowExceptionHelper.RequiredParameterNotProvided("TodoStatus", "p", "query string"); } - var p_temp = (string?)p_raw; - if (!Enum.TryParse(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 0c6575f5bada..b0d2353ff0e7 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,108 +54,128 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.String? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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!; + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?, IsOptional = True, IsParsable = False, IsArray = False, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + var p_temp = p_raw.Count > 0 ? (string?)p_raw : null; + string p_local = p_temp!; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(p_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = handler(p_local); + if (result is string) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string?, IsOptional = True, IsParsable = False, IsArray = False, Source = Query) - var p_raw = httpContext.Request.Query["p"]; - var p_temp = p_raw.Count > 0 ? (string?)p_raw : null; - string p_local = p_temp!; + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + return httpContext.Response.WriteAsync(result); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string?, IsOptional = True, IsParsable = False, IsArray = False, Source = Query) + var p_raw = httpContext.Request.Query["p"]; + var p_temp = p_raw.Count > 0 ? (string?)p_raw : null; + string p_local = p_temp!; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 855ba1387259..07fc5e6cd7c8 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,124 +54,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 MapPost_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter)), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - 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 (global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var serviceProviderIsService = serviceProvider?.GetService(); + var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", jsonOptions, serviceProviderIsService); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Action)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var serviceProviderIsService = serviceProvider?.GetService(); - var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", jsonOptions, serviceProviderIsService); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + 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!)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, x_local!)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 f8a60b0bd515..2306139a7a17 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 @@ -8,52 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - httpMethods, - filePath, - lineNumber); } - } } @@ -68,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -90,147 +54,168 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Collections.Generic.IEnumerable httpMethods, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - async Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 f8a60b0bd515..2306139a7a17 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 @@ -8,52 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - httpMethods, - filePath, - lineNumber); } - } } @@ -68,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -90,147 +54,168 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Collections.Generic.IEnumerable httpMethods, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - async Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 f8a60b0bd515..2306139a7a17 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 @@ -8,52 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - httpMethods, - filePath, - lineNumber); } - } } @@ -68,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -90,147 +54,168 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Collections.Generic.IEnumerable httpMethods, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - async Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 f8a60b0bd515..2306139a7a17 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 @@ -8,52 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - httpMethods, - filePath, - lineNumber); } - } } @@ -68,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -90,147 +54,168 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Collections.Generic.IEnumerable httpMethods, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - async Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 3f27c114fd2d..6c21b2df959a 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - PostVerb, - filePath, - lineNumber); } - } } @@ -67,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,147 +54,167 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); - } - - async Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 a3a6c26b7131..7443c48da0d0 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 @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,140 +54,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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { + (false, typeof(global::System.String[])), + }; + foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var serviceProviderIsService = serviceProvider.GetRequiredService(); - var jsonBodyOrServiceTypeTuples = new (bool, Type)[] { - (false, typeof(global::System.String[])), - }; - foreach (var (isOptional, type) in jsonBodyOrServiceTypeTuples) + if (!serviceProviderIsService.IsService(type)) { - if (!serviceProviderIsService.IsService(type)) - { - options.EndpointBuilder.Metadata.Add(new 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: typeof(global::System.Int32), statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + 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() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); - - 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); - } - - async Task RequestHandler(HttpContext httpContext) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - 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) + if (ic.HttpContext.Response.StatusCode == 400) { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - httpContext.Response.StatusCode = 400; return; } - var result = handler(p_local); - await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else - { - var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); - var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); - p_local = p_resolveBodyResult.Item2!; - if (!p_resolveBodyResult.Item1) - { - return; - } - } + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(p_local); + await httpContext.Response.WriteAsJsonAsync(result, responseJsonTypeInfo); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); - if (result is not null) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) + global::System.String[] p_local = null!; + if (options.DisableInferBodyFromParameters) + { + var p_raw = httpContext.Request.Query["p"]; + p_local = p_raw!; + } + else + { + var p_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[])); + var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo); + p_local = p_resolveBodyResult.Item2!; + if (!p_resolveBodyResult.Item1) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return; } } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, p_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 c2eda94cd063..c6cfab7dee6d 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 @@ -8,81 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -97,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -119,318 +54,294 @@ 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)] + [InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + return httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + if (wasParamCheckFailure) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler()); - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; } - - Task RequestHandler(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + if (result is not null) { - var wasParamCheckFailure = false; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - async Task RequestHandlerFiltered(HttpContext httpContext) + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet_275( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.Threading.Tasks.Task () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic => { - var wasParamCheckFailure = false; - if (wasParamCheckFailure) + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; + return (object?)Results.Empty; } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } - } + var result = await handler(); + return (object?)result; + }, + options.EndpointBuilder, + handler.Method); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + if (wasParamCheckFailure) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return (object?)Results.Empty; - } - var result = await handler(); - return (object?)result; - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; + return; } - - async Task RequestHandler(HttpContext httpContext) + var result = await handler(); + if (result is string) { - var wasParamCheckFailure = false; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = await handler(); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + else { - var wasParamCheckFailure = false; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + if (wasParamCheckFailure) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return (object?)Results.Empty; - } - var result = await handler(); - return (object?)result; - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - async Task RequestHandler(HttpContext httpContext) + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 28, 5)] + internal static RouteHandlerBuilder MapGet_285( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.Threading.Tasks.ValueTask () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic => { - var wasParamCheckFailure = false; - if (wasParamCheckFailure) + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.StatusCode = 400; - return; + return (object?)Results.Empty; } var result = await handler(); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + return (object?)result; + }, + options.EndpointBuilder, + handler.Method); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = await handler(); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 312308b52b6c..7917d7ca74f8 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 @@ -8,82 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -97,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -119,257 +54,305 @@ 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_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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; + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var req_local = httpContext.Request; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(req_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = handler(req_local); + if (result is string) { - var wasParamCheckFailure = false; - var req_local = httpContext.Request; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, req_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + return httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + var req_local = httpContext.Request; + + if (wasParamCheckFailure) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!)); - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; } - - Task RequestHandler(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, req_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var res_local = httpContext.Response; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(res_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - return httpContext.Response.WriteAsync(result); + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - var res_local = httpContext.Response; + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, res_local)); - if (result is not null) +[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet_265( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpResponse arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + return ValueTask.FromResult(Results.Empty); } - } + 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 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var wasParamCheckFailure = false; + var res_local = httpContext.Response; + + if (wasParamCheckFailure) { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => - { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(Results.Empty); - } - return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); - }, - options.EndpointBuilder, - handler.Method); + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(res_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + return httpContext.Response.WriteAsync(result); + } - Task RequestHandler(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var res_local = httpContext.Response; + + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var req_local = httpContext.Request; - var res_local = httpContext.Response; + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, res_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(req_local, res_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet_275( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0, global::Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + return ValueTask.FromResult(Results.Empty); } - return httpContext.Response.WriteAsync(result); - } + 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; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var req_local = httpContext.Request; - var res_local = httpContext.Response; + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(req_local, res_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + return httpContext.Response.WriteAsync(result); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, req_local, res_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var req_local = httpContext.Request; + var res_local = httpContext.Response; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, req_local, res_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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 2db1b700475d..e7822d4de8a6 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt @@ -8,51 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - 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 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -89,192 +54,212 @@ 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_295( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.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 System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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 (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.IFormFile arg1, global::Microsoft.AspNetCore.Http.IFormFileCollection arg2, global::Microsoft.AspNetCore.Http.IFormCollection arg3, global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord arg4) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Action)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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); + } - 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!)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, file_local!, fileCollection_local!, collection_local!, tryParseRecord_local!)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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/SupportsSameInterceptorsFromDifferentFiles.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt new file mode 100644 index 000000000000..5806811c544f --- /dev/null +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt @@ -0,0 +1,424 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable + +namespace System.Runtime.CompilerServices +{ + %GENERATEDCODEATTRIBUTE% + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute + { + public InterceptsLocationAttribute(string filePath, int line, int column) + { + } + } +} + +namespace Microsoft.AspNetCore.Http.Generated +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using System.Globalization; + using System.Linq; + using System.Reflection; + using System.Runtime.CompilerServices; + using System.Text.Json; + using System.Text.Json.Serialization.Metadata; + using System.Threading.Tasks; + using System.IO; + using Microsoft.AspNetCore.Routing; + using Microsoft.AspNetCore.Routing.Patterns; + using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Http; + using Microsoft.AspNetCore.Http.Json; + using Microsoft.AspNetCore.Http.Metadata; + using Microsoft.Extensions.DependencyInjection; + using Microsoft.Extensions.FileProviders; + using Microsoft.Extensions.Logging; + using Microsoft.Extensions.Primitives; + using Microsoft.Extensions.Options; + + using MetadataPopulator = System.Func; + using RequestDelegateFactoryFunc = System.Func; + + %GENERATEDCODEATTRIBUTE% + file static class GeneratedRouteBuilderExtensionsCore + { + 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)] + [InterceptsLocation(@"OtherTestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet_2513( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var name_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("name", options.RouteParameterNames); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: name (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery) + var name_raw = name_RouteOrQueryResolver(httpContext); + if (name_raw is StringValues { Count: 0 }) + { + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "name", "route or query string"); + } + var name_temp = (string?)name_raw; + string name_local = name_temp!; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(name_local!); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + return httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: name (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery) + var name_raw = name_RouteOrQueryResolver(httpContext); + if (name_raw is StringValues { Count: 0 }) + { + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "name", "route or query string"); + } + var name_temp = (string?)name_raw; + string name_local = name_temp!; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, name_local!)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + + + 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) + { + var routeHandlerFilters = builder.FilterFactories; + var context0 = new EndpointFilterFactoryContext + { + MethodInfo = mi, + ApplicationServices = builder.ApplicationServices, + }; + var initialFilteredInvocation = filteredInvocation; + for (var i = routeHandlerFilters.Count - 1; i >= 0; i--) + { + var filterFactory = routeHandlerFilters[i]; + filteredInvocation = filterFactory(context0, filteredInvocation); + } + return filteredInvocation; + } + + private static Task ExecuteReturnAsync(object? obj, HttpContext httpContext, JsonTypeInfo jsonTypeInfo) + { + if (obj is IResult r) + { + return r.ExecuteAsync(httpContext); + } + else if (obj is string s) + { + return httpContext.Response.WriteAsync(s); + } + else + { + return WriteJsonResponseAsync(httpContext.Response, obj, jsonTypeInfo); + } + } + + [UnconditionalSuppressMessage("Trimming", "IL2026:RequiresUnreferencedCode", + Justification = "The 'JsonSerializer.IsReflectionEnabledByDefault' feature switch, which is set to false by default for trimmed ASP.NET apps, ensures the JsonSerializer doesn't use Reflection.")] + [UnconditionalSuppressMessage("AOT", "IL3050:RequiresDynamicCode", Justification = "See above.")] + private static Task WriteJsonResponseAsync(HttpResponse response, T? value, JsonTypeInfo jsonTypeInfo) + { + var runtimeType = value?.GetType(); + + if (jsonTypeInfo.ShouldUseWith(runtimeType)) + { + return HttpResponseJsonExtensions.WriteAsJsonAsync(response, value, jsonTypeInfo, default); + } + + return response.WriteAsJsonAsync(value, jsonTypeInfo.Options); + } + + private static bool HasKnownPolymorphism(this JsonTypeInfo jsonTypeInfo) + => jsonTypeInfo.Type.IsSealed || jsonTypeInfo.Type.IsValueType || jsonTypeInfo.PolymorphismOptions is not null; + + private static bool ShouldUseWith(this JsonTypeInfo jsonTypeInfo, [NotNullWhen(false)] Type? runtimeType) + => runtimeType is null || jsonTypeInfo.Type == runtimeType || jsonTypeInfo.HasKnownPolymorphism(); + + private static Func ResolveFromRouteOrQuery(string parameterName, IEnumerable? routeParameterNames) + { + return routeParameterNames?.Contains(parameterName, StringComparer.OrdinalIgnoreCase) == true + ? (httpContext) => new StringValues((string?)httpContext.Request.RouteValues[parameterName]) + : (httpContext) => httpContext.Request.Query[parameterName]; + } + + } + + %GENERATEDCODEATTRIBUTE% + file sealed class GeneratedProducesResponseTypeMetadata : IProducesResponseTypeMetadata + { + public GeneratedProducesResponseTypeMetadata(Type? type, int statusCode, string[] contentTypes) + { + Type = type; + StatusCode = statusCode; + ContentTypes = contentTypes; + } + + public Type? Type { get; } + + public int StatusCode { get; } + + public IEnumerable ContentTypes { get; } + } + + %GENERATEDCODEATTRIBUTE% + file static class GeneratedMetadataConstants + { + public static readonly string[] JsonContentType = new [] { "application/json" }; + public static readonly string[] PlaintextContentType = new [] { "text/plain" }; + public static readonly string[] FormFileContentType = new[] { "multipart/form-data" }; + public static readonly string[] FormContentType = new[] { "multipart/form-data", "application/x-www-form-urlencoded" }; + } + + + %GENERATEDCODEATTRIBUTE% + file sealed class LogOrThrowExceptionHelper + { + private readonly ILogger? _rdgLogger; + private readonly bool _shouldThrow; + + public LogOrThrowExceptionHelper(IServiceProvider? serviceProvider, RequestDelegateFactoryOptions? options) + { + var loggerFactory = serviceProvider?.GetRequiredService(); + _rdgLogger = loggerFactory?.CreateLogger("Microsoft.AspNetCore.Http.RequestDelegateGenerator.RequestDelegateGenerator"); + _shouldThrow = options?.ThrowOnBadRequest ?? false; + } + + public void RequestBodyIOException(IOException exception) + { + if (_rdgLogger != null) + { + _requestBodyIOException(_rdgLogger, exception); + } + } + + private static readonly Action _requestBodyIOException = + LoggerMessage.Define(LogLevel.Debug, new EventId(1, "RequestBodyIOException"), "Reading the request body failed with an IOException."); + + public void InvalidJsonRequestBody(string parameterTypeName, string parameterName, Exception exception) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Failed to read parameter \"{0} {1}\" from the request body as JSON.", parameterTypeName, parameterName); + throw new BadHttpRequestException(message, exception); + } + + if (_rdgLogger != null) + { + _invalidJsonRequestBody(_rdgLogger, parameterTypeName, parameterName, exception); + } + } + + private static readonly Action _invalidJsonRequestBody = + LoggerMessage.Define(LogLevel.Debug, new EventId(2, "InvalidJsonRequestBody"), "Failed to read parameter \"{ParameterType} {ParameterName}\" from the request body as JSON."); + + public void ParameterBindingFailed(string parameterTypeName, string parameterName, string sourceValue) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Failed to bind parameter \"{0} {1}\" from \"{2}\".", parameterTypeName, parameterName, sourceValue); + throw new BadHttpRequestException(message); + } + + if (_rdgLogger != null) + { + _parameterBindingFailed(_rdgLogger, parameterTypeName, parameterName, sourceValue, null); + } + } + + private static readonly Action _parameterBindingFailed = + LoggerMessage.Define(LogLevel.Debug, new EventId(3, "ParameterBindingFailed"), "Failed to bind parameter \"{ParameterType} {ParameterName}\" from \"{SourceValue}\"."); + + public void RequiredParameterNotProvided(string parameterTypeName, string parameterName, string source) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Required parameter \"{0} {1}\" was not provided from {2}.", parameterTypeName, parameterName, source); + throw new BadHttpRequestException(message); + } + + if (_rdgLogger != null) + { + _requiredParameterNotProvided(_rdgLogger, parameterTypeName, parameterName, source, null); + } + } + + private static readonly Action _requiredParameterNotProvided = + LoggerMessage.Define(LogLevel.Debug, new EventId(4, "RequiredParameterNotProvided"), "Required parameter \"{ParameterType} {ParameterName}\" was not provided from {Source}."); + + public void ImplicitBodyNotProvided(string parameterName) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Implicit body inferred for parameter \"{0}\" but no body was provided. Did you mean to use a Service instead?", parameterName); + throw new BadHttpRequestException(message); + } + + if (_rdgLogger != null) + { + _implicitBodyNotProvided(_rdgLogger, parameterName, null); + } + } + + private static readonly Action _implicitBodyNotProvided = + LoggerMessage.Define(LogLevel.Debug, new EventId(5, "ImplicitBodyNotProvided"), "Implicit body inferred for parameter \"{ParameterName}\" but no body was provided. Did you mean to use a Service instead?"); + + public void UnexpectedJsonContentType(string? contentType) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Expected a supported JSON media type but got \"{0}\".", contentType); + throw new BadHttpRequestException(message, StatusCodes.Status415UnsupportedMediaType); + } + + if (_rdgLogger != null) + { + _unexpectedJsonContentType(_rdgLogger, contentType ?? "(none)", null); + } + } + + private static readonly Action _unexpectedJsonContentType = + LoggerMessage.Define(LogLevel.Debug, new EventId(6, "UnexpectedContentType"), "Expected a supported JSON media type but got \"{ContentType}\"."); + + public void UnexpectedNonFormContentType(string? contentType) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Expected a supported form media type but got \"{0}\".", contentType); + throw new BadHttpRequestException(message, StatusCodes.Status415UnsupportedMediaType); + } + + if (_rdgLogger != null) + { + _unexpectedNonFormContentType(_rdgLogger, contentType ?? "(none)", null); + } + } + + private static readonly Action _unexpectedNonFormContentType = + LoggerMessage.Define(LogLevel.Debug, new EventId(7, "UnexpectedNonFormContentType"), "Expected a supported form media type but got \"{ContentType}\"."); + + public void InvalidFormRequestBody(string parameterTypeName, string parameterName, Exception exception) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Failed to read parameter \"{0} {1}\" from the request body as form.", parameterTypeName, parameterName); + throw new BadHttpRequestException(message, exception); + } + + if (_rdgLogger != null) + { + _invalidFormRequestBody(_rdgLogger, parameterTypeName, parameterName, exception); + } + } + + private static readonly Action _invalidFormRequestBody = + LoggerMessage.Define(LogLevel.Debug, new EventId(8, "InvalidFormRequestBody"), "Failed to read parameter \"{ParameterType} {ParameterName}\" from the request body as form."); + } +} 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 7232bd5891e0..394804e24228 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt @@ -8,112 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - 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) - { - 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -127,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -149,532 +54,608 @@ 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_445( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) { - [(@"TestMapActions.cs", 44)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 44)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Action)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + 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; + 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!; - 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; + 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!; - 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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 45, 5)] + internal static RouteHandlerBuilder MapGet_455( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var Value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("Value", options.RouteParameterNames); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Action)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var Value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("Value", options.RouteParameterNames); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + 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 }) { - 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)) + { + 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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 46, 5)] + internal static RouteHandlerBuilder MapGet_465( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Action)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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; + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters) + var HttpContext_local = httpContext; + var User_local = httpContext.User; + var Request_local = httpContext.Request; + var Response_local = httpContext.Response; - var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext(HttpContext_local, User_local, Request_local, Response_local); + var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext(HttpContext_local, User_local, Request_local, Response_local); - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - handler(args_local); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; return Task.CompletedTask; } + handler(args_local); + return Task.CompletedTask; + } - async Task RequestHandlerFiltered(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters) - var HttpContext_local = httpContext; - var User_local = httpContext.User; - var Request_local = httpContext.Request; - var Response_local = httpContext.Response; + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters) + var HttpContext_local = httpContext; + var User_local = httpContext.User; + var Request_local = httpContext.Request; + var Response_local = httpContext.Response; - var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext(HttpContext_local, User_local, Request_local, Response_local); + var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext(HttpContext_local, User_local, Request_local, Response_local); - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } - - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != 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 jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var serviceProviderIsService = serviceProvider?.GetService(); - var Todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TodoStruct", "Todo", jsonOptions, serviceProviderIsService); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + if (result is not null) { - 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); + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandler(HttpContext httpContext) +[InterceptsLocation(@"TestMapActions.cs", 47, 5)] + internal static RouteHandlerBuilder MapPost_475( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var serviceProviderIsService = serviceProvider?.GetService(); + var Todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TodoStruct", "Todo", jsonOptions, serviceProviderIsService); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - var wasParamCheckFailure = false; - // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters) - var HttpContext_local = httpContext; - // Endpoint Parameter: Todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService) - var Todo_resolveJsonBodyOrServiceResult = await Todo_JsonBodyOrServiceResolver(httpContext, false); - var Todo_local = Todo_resolveJsonBodyOrServiceResult.Item2; - if (!Todo_resolveJsonBodyOrServiceResult.Item1) + if (ic.HttpContext.Response.StatusCode == 400) { - return; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters) + var HttpContext_local = httpContext; + // Endpoint Parameter: Todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService) + var Todo_resolveJsonBodyOrServiceResult = await Todo_JsonBodyOrServiceResolver(httpContext, false); + var Todo_local = Todo_resolveJsonBodyOrServiceResult.Item2; + if (!Todo_resolveJsonBodyOrServiceResult.Item1) + { + return; + } - 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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.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 global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } + +[InterceptsLocation(@"TestMapActions.cs", 48, 5)] + internal static RouteHandlerBuilder MapGet_485( + this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, + [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, + System.Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new 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 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var serviceProviderIsService = serviceProvider?.GetService(); + var Value_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "AddsCustomParameterMetadataAsProperty", "Value", jsonOptions, serviceProviderIsService); + + if (options.EndpointBuilder.FilterFactories.Count > 0) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Action)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var serviceProviderIsService = serviceProvider?.GetService(); - var Value_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "AddsCustomParameterMetadataAsProperty", "Value", jsonOptions, serviceProviderIsService); - - if (options.EndpointBuilder.FilterFactories.Count > 0) + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => { - filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + if (ic.HttpContext.Response.StatusCode == 400) { - if (ic.HttpContext.Response.StatusCode == 400) - { - return ValueTask.FromResult(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) + 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)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, args_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return global::Microsoft.AspNetCore.Http.Generated.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..79c9d693d057 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs @@ -1,7 +1,11 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Collections.Immutable; +using System.Text; using Microsoft.CodeAnalysis; using Microsoft.AspNetCore.Http.RequestDelegateGenerator; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Text; namespace Microsoft.AspNetCore.Http.Generators.Tests; @@ -37,4 +41,65 @@ 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 SupportsSameInterceptorsFromDifferentFiles() + { + var project = CreateProject(); + var source = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");"""); + var otherSource = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");""", "OtherTestMapActions"); + project = project.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8)).Project; + project = project.AddDocument("OtherTestMapActions.cs", SourceText.From(otherSource, Encoding.UTF8)).Project; + var compilation = await project.GetCompilationAsync(); + + var generator = new RequestDelegateGenerator.RequestDelegateGenerator().AsSourceGenerator(); + GeneratorDriver driver = CSharpGeneratorDriver.Create(generators: new[] + { + generator + }, + driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true), + parseOptions: ParseOptions); + driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation, + out var _); + + var diagnostics = updatedCompilation.GetDiagnostics(); + Assert.Empty(diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Warning)); + + await VerifyAgainstBaselineUsingFile(updatedCompilation); + } + + [Fact] + public async Task SourceMapsAllPathsInAttribute() + { + var currentDirectory = Directory.GetCurrentDirectory(); + var mappedDirectory = Path.Combine(currentDirectory, "path", "mapped"); + var project = CreateProject(modifyCompilationOptions: + (options) => + { + return options.WithSourceReferenceResolver( + new SourceFileResolver(ImmutableArray.Empty, currentDirectory, ImmutableArray.Create(new KeyValuePair(currentDirectory, mappedDirectory)))); + }); + var source = GetMapActionString("""app.MapGet("/", () => "Hello world!");"""); + project = project.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8), filePath: Path.Combine(currentDirectory, "TestMapActions.cs")).Project; + var compilation = await project.GetCompilationAsync(); + + var generator = new RequestDelegateGenerator.RequestDelegateGenerator().AsSourceGenerator(); + GeneratorDriver driver = CSharpGeneratorDriver.Create(generators: new[] + { + generator + }, + driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true), + parseOptions: ParseOptions); + driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation, + out var diags); + + var diagnostics = updatedCompilation.GetDiagnostics(); + Assert.Empty(diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Warning)); + + var endpoint = GetEndpointFromCompilation(updatedCompilation); + var httpContext = CreateHttpContext(); + + await endpoint.RequestDelegate(httpContext); + await VerifyResponseBodyAsync(httpContext, "Hello world!"); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs index 443768397f0b..387a601d4f0c 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.CodeDom.Compiler; +using System.Collections.Immutable; using System.Globalization; using System.IO.Pipelines; using System.Reflection; @@ -16,6 +18,7 @@ using Microsoft.AspNetCore.Testing; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Emit; using Microsoft.CodeAnalysis.Text; using Microsoft.Extensions.DependencyInjection; @@ -31,12 +34,11 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest protected abstract bool IsGeneratorEnabled { get; } + internal static readonly CSharpParseOptions ParseOptions = new CSharpParseOptions(LanguageVersion.Preview).WithFeatures(new[] { new KeyValuePair("InterceptorsPreview", "") }); private static readonly Project _baseProject = CreateProject(); internal async Task<(GeneratorRunResult?, Compilation)> RunGeneratorAsync(string sources, params string[] updatedSources) { - var source = GetMapActionString(sources); - var project = _baseProject.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8)).Project; // Create a Roslyn compilation for the syntax tree. var compilation = await CreateCompilationAsync(sources); @@ -55,12 +57,13 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest { generator }, - driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true)); + driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true), + parseOptions: ParseOptions); driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation, out var _); foreach (var updatedSource in updatedSources) { - var syntaxTree = CSharpSyntaxTree.ParseText(GetMapActionString(updatedSource), path: $"TestMapActions.cs"); + var syntaxTree = CSharpSyntaxTree.ParseText(GetMapActionString(updatedSource), path: $"TestMapActions.cs", options: ParseOptions); compilation = compilation .ReplaceSyntaxTree(compilation.SyntaxTrees.First(), syntaxTree); driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out updatedCompilation, @@ -73,7 +76,7 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest return (Assert.Single(runResult.Results), updatedCompilation); } - internal static RequestDelegateGenerator.StaticRouteHandlerModel.Endpoint GetStaticEndpoint(GeneratorRunResult result, string stepName) => + internal static RequestDelegateGenerator.StaticRouteHandlerModel.Endpoint GetStaticEndpoint(GeneratorRunResult result, string stepName) => Assert.Single(GetStaticEndpoints(result, stepName)); internal static RequestDelegateGenerator.StaticRouteHandlerModel.Endpoint[] GetStaticEndpoints(GeneratorRunResult result, string stepName) @@ -134,7 +137,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); @@ -153,7 +156,6 @@ internal Endpoint[] GetEndpointsFromCompilation(Compilation compilation, bool? e var handler = assembly.GetType("TestMapActions") ?.GetMethod("MapTestEndpoints", BindingFlags.Public | BindingFlags.Static) ?.CreateDelegate>(); - var sourceKeyType = assembly.GetType("Microsoft.AspNetCore.Builder.SourceKey"); Assert.NotNull(handler); @@ -167,11 +169,14 @@ internal Endpoint[] GetEndpointsFromCompilation(Compilation compilation, bool? e foreach (var endpoint in endpoints) { - var sourceKeyMetadata = endpoint.Metadata.FirstOrDefault(metadata => metadata.GetType() == sourceKeyType); + var sourceKeyMetadata = endpoint.Metadata.OfType().SingleOrDefault(); if (expectSourceKey) { Assert.NotNull(sourceKeyMetadata); + var generatedCode = Assert.IsType(sourceKeyMetadata); + Assert.Equal(typeof(RequestDelegateGeneratorSources).Assembly.FullName, generatedCode.Tool); + Assert.Equal(typeof(RequestDelegateGeneratorSources).Assembly.GetName().Version?.ToString(), generatedCode.Version); } else { @@ -254,7 +259,7 @@ internal static async Task VerifyResponseBodyAsync(HttpContext httpContext, stri Assert.Equal(expectedBody, body); } - private static string GetMapActionString(string sources) => $$""" + internal static string GetMapActionString(string sources, string className = "TestMapActions") => $$""" #nullable enable using System; using System.Collections.Generic; @@ -275,7 +280,7 @@ private static string GetMapActionString(string sources) => $$""" using Microsoft.AspNetCore.Http.Generators.Tests; using Microsoft.Extensions.Primitives; -public static class TestMapActions +public static class {{className}} { public static IEndpointRouteBuilder MapTestEndpoints(this IEndpointRouteBuilder app) { @@ -294,14 +299,19 @@ private static Task CreateCompilationAsync(string sources) return project.GetCompilationAsync(); } - private static Project CreateProject() + internal static Project CreateProject(Func modifyCompilationOptions = null) { var projectName = $"TestProject-{Guid.NewGuid()}"; + var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) + .WithNullableContextOptions(NullableContextOptions.Enable); + if (modifyCompilationOptions is not null) + { + compilationOptions = modifyCompilationOptions(compilationOptions); + } var project = new AdhocWorkspace().CurrentSolution .AddProject(projectName, projectName, LanguageNames.CSharp) - .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) - .WithNullableContextOptions(NullableContextOptions.Enable)) - .WithParseOptions(new CSharpParseOptions(LanguageVersion.CSharp11)); + .WithCompilationOptions(compilationOptions) + .WithParseOptions(ParseOptions); // Add in required metadata references var resolver = new AppLocalResolver(); diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs index f548e2620548..99607f97ed1a 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTests.Metadata.cs @@ -16,6 +16,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Primitives; using System; +using System.CodeDom.Compiler; namespace Microsoft.AspNetCore.Http.Generators.Tests; @@ -499,7 +500,7 @@ public async Task InferMetadata_ThenCreate_CombinesAllMetadata_InCorrectOrder() // of this test from RDF. var filteredMetadata = endpoint.Metadata.Where( m => m.GetType().Name != "NullableContextAttribute" && - m.GetType().Name != "SourceKey" && + m is not GeneratedCodeAttribute && m is not MethodInfo && m is not HttpMethodMetadata && m is not Attribute1 && diff --git a/src/Http/samples/MinimalSample/MinimalSample.csproj b/src/Http/samples/MinimalSample/MinimalSample.csproj index 776749f542df..7783a82fe5d8 100644 --- a/src/Http/samples/MinimalSample/MinimalSample.csproj +++ b/src/Http/samples/MinimalSample/MinimalSample.csproj @@ -5,6 +5,7 @@ enable true true + true diff --git a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj index 3530a7c946e6..6e19a41a58fc 100644 --- a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj +++ b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj @@ -9,6 +9,7 @@ false true true + $(Features);InterceptorsPreview 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/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs b/src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs new file mode 100644 index 000000000000..23466c6728ba --- /dev/null +++ b/src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs @@ -0,0 +1,37 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using Microsoft.CodeAnalysis; + +internal static class IncrementalValuesProviderExtensions +{ + public static IncrementalValuesProvider<(TSource Source, ImmutableArray Elements)> GroupWith( + this IncrementalValuesProvider source, + Func sourceToElementTransform, + IEqualityComparer comparer) + { + return source.Collect().SelectMany((values, _) => + { + Dictionary.Builder> map = new(comparer); + foreach (var value in values) + { + if (!map.TryGetValue(value, out ImmutableArray.Builder builder)) + { + builder = ImmutableArray.CreateBuilder(); + map.Add(value, builder); + } + builder.Add(sourceToElementTransform(value)); + } + ImmutableArray<(TSource Key, ImmutableArray Elements)>.Builder result = + ImmutableArray.CreateBuilder<(TSource, ImmutableArray)>(); + foreach (KeyValuePair.Builder> entry in map) + { + result.Add((entry.Key, entry.Value.ToImmutable())); + } + return result; + }); + } +} diff --git a/src/Shared/RoslynUtils/SyntaxTreeExtensions.cs b/src/Shared/RoslynUtils/SyntaxTreeExtensions.cs index 47bd7babd313..9ebccf176c6f 100644 --- a/src/Shared/RoslynUtils/SyntaxTreeExtensions.cs +++ b/src/Shared/RoslynUtils/SyntaxTreeExtensions.cs @@ -6,18 +6,9 @@ internal static class SyntaxTreeExtensions { - // Utilize the same logic used by the `CallerLinePathAttribute` for generating - // a file path for a given syntax tree. - // Source copied from https://github.com/dotnet/roslyn/blob/5b47c7fe326faa35940f220c14f718cd0b820c38/src/Compilers/Core/Portable/Syntax/SyntaxTree.cs#L274-L293 until - // public APIs are available. - internal static string GetDisplayPath(this SyntaxTree tree, TextSpan span, SourceReferenceResolver? resolver) - { - var mappedSpan = tree.GetMappedLineSpan(span); - if (resolver == null || mappedSpan.Path.Length == 0) - { - return mappedSpan.Path; - } - - return resolver.NormalizePath(mappedSpan.Path, baseFilePath: mappedSpan.HasMappedPath ? tree.FilePath : null) ?? mappedSpan.Path; - } + // Utilize the same logic used by the interceptors API for resolving the source mapped + // value of a path. + // https://github.com/dotnet/roslyn/blob/f290437fcc75dad50a38c09e0977cce13a64f5ba/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs#L1063-L1064 + internal static string GetInterceptorFilePath(this SyntaxTree tree, SourceReferenceResolver? resolver) => + resolver?.NormalizePath(tree.FilePath, baseFilePath: null) ?? tree.FilePath; } 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 From 0fb3ca6252be56867149c32325aee95cb90f45c1 Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Thu, 6 Jul 2023 09:42:55 -0700 Subject: [PATCH 2/4] Address feedback from review --- .../gen/RequestDelegateGenerator.cs | 17 +- ...MapAction_BindAsync_Snapshot.generated.txt | 198 +++++++++--------- ...Param_ComplexReturn_Snapshot.generated.txt | 18 +- ...Header_ComplexTypeArrayParam.generated.txt | 8 +- ...der_NullableStringArrayParam.generated.txt | 8 +- ...licitHeader_StringArrayParam.generated.txt | 8 +- ...tQuery_ComplexTypeArrayParam.generated.txt | 8 +- ...ery_NullableStringArrayParam.generated.txt | 8 +- ...plicitQuery_StringArrayParam.generated.txt | 8 +- ...eParam_SimpleReturn_Snapshot.generated.txt | 28 +-- ...Source_SimpleReturn_Snapshot.generated.txt | 8 +- ...tQuery_ComplexTypeArrayParam.generated.txt | 8 +- ...ery_NullableStringArrayParam.generated.txt | 8 +- ...gArrayParam_EmptyQueryValues.generated.txt | 8 +- ...ngArrayParam_QueryNotPresent.generated.txt | 8 +- ...plicitQuery_StringArrayParam.generated.txt | 8 +- ...ce_HandlesBothJsonAndService.generated.txt | 8 +- ...pecialTypeParam_StringReturn.generated.txt | 8 +- ...ipleStringParam_StringReturn.generated.txt | 8 +- ...aram_StringReturn_WithFilter.generated.txt | 8 +- ...n_ReturnsString_Has_Metadata.generated.txt | 8 +- ...ion_ReturnsTodo_Has_Metadata.generated.txt | 8 +- ...onProblemResult_Has_Metadata.generated.txt | 8 +- ..._ReturnsVoid_Has_No_Metadata.generated.txt | 8 +- ...omplexTypeParam_StringReturn.generated.txt | 8 +- ...SingleEnumParam_StringReturn.generated.txt | 8 +- ...ngValueProvided_StringReturn.generated.txt | 8 +- ...MetadataEmitter_Has_Metadata.generated.txt | 8 +- ...AndBody_ShouldUseQueryString.generated.txt | 10 +- ...AndBody_ShouldUseQueryString.generated.txt | 10 +- ...String_AndBody_ShouldUseBody.generated.txt | 10 +- ...String_AndBody_ShouldUseBody.generated.txt | 10 +- ...String_AndBody_ShouldUseBody.generated.txt | 8 +- ...hArrayQueryString_ShouldFail.generated.txt | 8 +- ...pAction_NoParam_StringReturn.generated.txt | 28 +-- ...tion_WithParams_StringReturn.generated.txt | 28 +-- ...ateValidateGeneratedFormCode.generated.txt | 8 +- ...terceptorsFromDifferentFiles.generated.txt | 8 +- .../VerifyAsParametersBaseline.generated.txt | 48 ++--- 39 files changed, 315 insertions(+), 314 deletions(-) diff --git a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs index 6be42421b9a8..b3312f0defb2 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs @@ -64,18 +64,18 @@ public void Initialize(IncrementalGeneratorInitializationContext context) } codeWriter.WriteLine($"internal static RouteHandlerBuilder {endpoint.HttpMethod}_{endpoint.Location.LineNumber}{endpoint.Location.CharacterNumber}("); codeWriter.Indent++; - codeWriter.WriteLine("this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,"); + 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(@"[System.Diagnostics.CodeAnalysis.StringSyntax(""Route"")] string pattern,"); + codeWriter.WriteLine(@"[StringSyntax(""Route"")] string pattern,"); } // MapMethods overloads define an additional `httpMethods` parameter if (endpoint.HttpMethod == "MapMethods") { - codeWriter.WriteLine("System.Collections.Generic.IEnumerable httpMethods,"); + codeWriter.WriteLine("IEnumerable httpMethods,"); } - codeWriter.WriteLine("System.Delegate handler)"); + codeWriter.WriteLine("Delegate handler)"); codeWriter.Indent--; codeWriter.StartBlock(); codeWriter.WriteLine("MetadataPopulator populateMetadata = (methodInfo, options) =>"); @@ -130,7 +130,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) codeWriter.WriteLine("var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty;"); codeWriter.WriteLine("return new RequestDelegateResult(targetDelegate, metadata);"); codeWriter.EndBlockWithSemicolon(); - codeWriter.WriteLine("return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore("); + codeWriter.WriteLine("return MapCore("); codeWriter.Indent++; codeWriter.WriteLine("endpoints,"); // For `MapFallback` overloads that only take a delegate, provide the assumed default @@ -262,13 +262,14 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { return; } - var endpoints = new StringBuilder(); + using var stringWriter = new StringWriter(CultureInfo.InvariantCulture); + using var codeWriter = new CodeWriter(stringWriter, baseIndent: 2); foreach (var endpoint in endpointsCode) { - endpoints.AppendLine(endpoint); + codeWriter.WriteLine(endpoint); } var code = RequestDelegateGeneratorSources.GetGeneratedRouteBuilderExtensionsSource( - endpoints: endpoints.ToString(), + endpoints: stringWriter.ToString(), helperMethods: helperMethods ?? string.Empty, helperTypes: helperTypes ?? string.Empty); 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 e80b1aad5ac7..7fc4d78d2942 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -168,7 +168,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -177,11 +177,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + [InterceptsLocation(@"TestMapActions.cs", 26, 5)] internal static RouteHandlerBuilder MapGet_265( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -263,7 +263,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -272,11 +272,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] internal static RouteHandlerBuilder MapGet_275( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -380,7 +380,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -389,11 +389,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 28, 5)] + [InterceptsLocation(@"TestMapActions.cs", 28, 5)] internal static RouteHandlerBuilder MapGet_285( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -475,7 +475,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -484,11 +484,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 29, 5)] + [InterceptsLocation(@"TestMapActions.cs", 29, 5)] internal static RouteHandlerBuilder MapGet_295( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -592,7 +592,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -601,11 +601,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 30, 5)] + [InterceptsLocation(@"TestMapActions.cs", 30, 5)] internal static RouteHandlerBuilder MapGet_305( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -687,7 +687,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -696,11 +696,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 31, 5)] + [InterceptsLocation(@"TestMapActions.cs", 31, 5)] internal static RouteHandlerBuilder MapGet_315( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -804,7 +804,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -813,11 +813,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 32, 5)] + [InterceptsLocation(@"TestMapActions.cs", 32, 5)] internal static RouteHandlerBuilder MapGet_325( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -899,7 +899,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -908,11 +908,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 33, 5)] + [InterceptsLocation(@"TestMapActions.cs", 33, 5)] internal static RouteHandlerBuilder MapGet_335( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1015,7 +1015,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1024,11 +1024,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 34, 5)] + [InterceptsLocation(@"TestMapActions.cs", 34, 5)] internal static RouteHandlerBuilder MapGet_345( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1109,7 +1109,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1118,11 +1118,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 35, 5)] + [InterceptsLocation(@"TestMapActions.cs", 35, 5)] internal static RouteHandlerBuilder MapGet_355( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1225,7 +1225,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1234,11 +1234,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 36, 5)] + [InterceptsLocation(@"TestMapActions.cs", 36, 5)] internal static RouteHandlerBuilder MapGet_365( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1319,7 +1319,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1328,11 +1328,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 37, 5)] + [InterceptsLocation(@"TestMapActions.cs", 37, 5)] internal static RouteHandlerBuilder MapGet_375( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1436,7 +1436,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1445,11 +1445,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 38, 5)] + [InterceptsLocation(@"TestMapActions.cs", 38, 5)] internal static RouteHandlerBuilder MapGet_385( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1531,7 +1531,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1540,11 +1540,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 39, 5)] + [InterceptsLocation(@"TestMapActions.cs", 39, 5)] internal static RouteHandlerBuilder MapGet_395( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1647,7 +1647,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1656,11 +1656,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 40, 5)] + [InterceptsLocation(@"TestMapActions.cs", 40, 5)] internal static RouteHandlerBuilder MapGet_405( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1741,7 +1741,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1750,11 +1750,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 41, 5)] + [InterceptsLocation(@"TestMapActions.cs", 41, 5)] internal static RouteHandlerBuilder MapGet_415( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1858,7 +1858,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1867,11 +1867,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 42, 5)] + [InterceptsLocation(@"TestMapActions.cs", 42, 5)] internal static RouteHandlerBuilder MapGet_425( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -1953,7 +1953,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -1962,11 +1962,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 43, 5)] + [InterceptsLocation(@"TestMapActions.cs", 43, 5)] internal static RouteHandlerBuilder MapGet_435( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -2069,7 +2069,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -2078,11 +2078,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 44, 5)] + [InterceptsLocation(@"TestMapActions.cs", 44, 5)] internal static RouteHandlerBuilder MapGet_445( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -2163,7 +2163,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 3857c424078b..88582fbae08b 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapPost_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -149,7 +149,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -158,11 +158,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] internal static RouteHandlerBuilder MapPost_275( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -247,7 +247,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 1036333cee8f..920bca52f564 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -168,7 +168,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 7f1c9d547f08..e6e9c0cc5724 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -142,7 +142,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 72735ca121b8..1cddc653976f 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -142,7 +142,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 779a5eb50238..d8a33d9b42dc 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -168,7 +168,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 6de7c0b87145..c63dfb17cab4 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -141,7 +141,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 bcea2ea3a4df..af05866b0b65 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -141,7 +141,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 197f766f419a..598007699711 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -145,7 +145,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -154,11 +154,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + [InterceptsLocation(@"TestMapActions.cs", 26, 5)] internal static RouteHandlerBuilder MapGet_265( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -239,7 +239,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -248,11 +248,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] internal static RouteHandlerBuilder MapGet_275( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -337,7 +337,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 f69171676415..34372edaa736 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 @@ -66,9 +66,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 28, 5)] [InterceptsLocation(@"TestMapActions.cs", 29, 5)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -163,7 +163,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 9dc6f531d65e..13eeeef6fd97 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -169,7 +169,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 87756fd1cedb..551024e655a0 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -181,7 +181,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 87756fd1cedb..551024e655a0 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -181,7 +181,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 87756fd1cedb..551024e655a0 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -181,7 +181,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 309e44ad6fd9..8058df3729c7 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -181,7 +181,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 4a43ef501294..fddfe081ca36 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapPost_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -186,7 +186,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 7a485dc092bd..5a44be5b1d71 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -144,7 +144,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 0b65e204a7a6..d4b7f622045c 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -177,7 +177,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 08791024fe18..68e05913c72d 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -138,7 +138,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 08791024fe18..68e05913c72d 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -138,7 +138,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 1a1dc3731484..e480949ce5f2 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -131,7 +131,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 be5cbeb6ada6..d720826d37f1 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -130,7 +130,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 cf63f02f2c3b..5fb9425f353b 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -130,7 +130,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 b35762253ce9..2e234d31b3c0 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -175,7 +175,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 6fe2dcaca5aa..6cb026f214fe 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -175,7 +175,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 b0d2353ff0e7..997e4542b564 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -149,7 +149,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 07fc5e6cd7c8..2967df51c79f 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapPost_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -165,7 +165,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 2306139a7a17..ab18e4c566e7 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 @@ -62,10 +62,10 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapMethods_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Collections.Generic.IEnumerable httpMethods, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable httpMethods, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -189,7 +189,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 2306139a7a17..ab18e4c566e7 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 @@ -62,10 +62,10 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapMethods_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Collections.Generic.IEnumerable httpMethods, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable httpMethods, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -189,7 +189,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 2306139a7a17..ab18e4c566e7 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 @@ -62,10 +62,10 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapMethods_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Collections.Generic.IEnumerable httpMethods, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable httpMethods, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -189,7 +189,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 2306139a7a17..ab18e4c566e7 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 @@ -62,10 +62,10 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapMethods_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Collections.Generic.IEnumerable httpMethods, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable httpMethods, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -189,7 +189,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 6c21b2df959a..c8cb5c16ba97 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapPost_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -188,7 +188,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 7443c48da0d0..7bcded683600 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapPost_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -181,7 +181,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 c6cfab7dee6d..962ce7d0a845 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 @@ -63,9 +63,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] [InterceptsLocation(@"TestMapActions.cs", 26, 5)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -139,7 +139,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -148,11 +148,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] internal static RouteHandlerBuilder MapGet_275( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -227,7 +227,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -236,11 +236,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 28, 5)] + [InterceptsLocation(@"TestMapActions.cs", 28, 5)] internal static RouteHandlerBuilder MapGet_285( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -315,7 +315,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 7917d7ca74f8..7176ca150e89 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 @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -142,7 +142,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -151,11 +151,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 26, 5)] + [InterceptsLocation(@"TestMapActions.cs", 26, 5)] internal static RouteHandlerBuilder MapGet_265( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -233,7 +233,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -242,11 +242,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 27, 5)] + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] internal static RouteHandlerBuilder MapGet_275( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -326,7 +326,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 e7822d4de8a6..12def0e458af 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 29, 5)] internal static RouteHandlerBuilder MapPost_295( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -233,7 +233,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt index 5806811c544f..dea9091357ec 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt @@ -63,9 +63,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] [InterceptsLocation(@"OtherTestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapGet_2513( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -161,7 +161,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, 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 394804e24228..fe45a653cd75 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt @@ -62,9 +62,9 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 44, 5)] internal static RouteHandlerBuilder MapGet_445( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -183,7 +183,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -192,11 +192,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 45, 5)] + [InterceptsLocation(@"TestMapActions.cs", 45, 5)] internal static RouteHandlerBuilder MapGet_455( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -308,7 +308,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -317,11 +317,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 46, 5)] + [InterceptsLocation(@"TestMapActions.cs", 46, 5)] internal static RouteHandlerBuilder MapGet_465( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -404,7 +404,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -413,11 +413,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 47, 5)] + [InterceptsLocation(@"TestMapActions.cs", 47, 5)] internal static RouteHandlerBuilder MapPost_475( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -519,7 +519,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, @@ -528,11 +528,11 @@ namespace Microsoft.AspNetCore.Http.Generated createRequestDelegate); } -[InterceptsLocation(@"TestMapActions.cs", 48, 5)] + [InterceptsLocation(@"TestMapActions.cs", 48, 5)] internal static RouteHandlerBuilder MapGet_485( - this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - System.Delegate handler) + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { MetadataPopulator populateMetadata = (methodInfo, options) => { @@ -629,7 +629,7 @@ namespace Microsoft.AspNetCore.Http.Generated var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; return new RequestDelegateResult(targetDelegate, metadata); }; - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( + return MapCore( endpoints, pattern, handler, From 4997fc05e1dfa94fa205df8142c912be478ed954 Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Fri, 7 Jul 2023 12:16:37 -0700 Subject: [PATCH 3/4] Add separator to method name and update same interceptor test --- .../gen/RequestDelegateGenerator.cs | 2 +- ...MapAction_BindAsync_Snapshot.generated.txt | 40 +++++++++---------- ...Param_ComplexReturn_Snapshot.generated.txt | 4 +- ...Header_ComplexTypeArrayParam.generated.txt | 2 +- ...der_NullableStringArrayParam.generated.txt | 2 +- ...licitHeader_StringArrayParam.generated.txt | 2 +- ...tQuery_ComplexTypeArrayParam.generated.txt | 2 +- ...ery_NullableStringArrayParam.generated.txt | 2 +- ...plicitQuery_StringArrayParam.generated.txt | 2 +- ...eParam_SimpleReturn_Snapshot.generated.txt | 6 +-- ...Source_SimpleReturn_Snapshot.generated.txt | 2 +- ...tQuery_ComplexTypeArrayParam.generated.txt | 2 +- ...ery_NullableStringArrayParam.generated.txt | 2 +- ...gArrayParam_EmptyQueryValues.generated.txt | 2 +- ...ngArrayParam_QueryNotPresent.generated.txt | 2 +- ...plicitQuery_StringArrayParam.generated.txt | 2 +- ...ce_HandlesBothJsonAndService.generated.txt | 2 +- ...pecialTypeParam_StringReturn.generated.txt | 2 +- ...ipleStringParam_StringReturn.generated.txt | 2 +- ...aram_StringReturn_WithFilter.generated.txt | 2 +- ...n_ReturnsString_Has_Metadata.generated.txt | 2 +- ...ion_ReturnsTodo_Has_Metadata.generated.txt | 2 +- ...onProblemResult_Has_Metadata.generated.txt | 2 +- ..._ReturnsVoid_Has_No_Metadata.generated.txt | 2 +- ...omplexTypeParam_StringReturn.generated.txt | 2 +- ...SingleEnumParam_StringReturn.generated.txt | 2 +- ...ngValueProvided_StringReturn.generated.txt | 2 +- ...MetadataEmitter_Has_Metadata.generated.txt | 2 +- ...AndBody_ShouldUseQueryString.generated.txt | 2 +- ...AndBody_ShouldUseQueryString.generated.txt | 2 +- ...String_AndBody_ShouldUseBody.generated.txt | 2 +- ...String_AndBody_ShouldUseBody.generated.txt | 2 +- ...String_AndBody_ShouldUseBody.generated.txt | 2 +- ...hArrayQueryString_ShouldFail.generated.txt | 2 +- ...pAction_NoParam_StringReturn.generated.txt | 6 +-- ...tion_WithParams_StringReturn.generated.txt | 6 +-- ...ateValidateGeneratedFormCode.generated.txt | 2 +- ...terceptorsFromDifferentFiles.generated.txt | 3 +- .../VerifyAsParametersBaseline.generated.txt | 10 ++--- .../CompileTimeCreationTests.cs | 2 +- .../RequestDelegateCreationTestBase.cs | 20 +++++----- 41 files changed, 81 insertions(+), 80 deletions(-) diff --git a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs index aaf40265eb84..8110eef0586b 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs @@ -62,7 +62,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { codeWriter.WriteLine($$"""[InterceptsLocation(@"{{location.File}}", {{location.LineNumber}}, {{location.CharacterNumber}})]"""); } - codeWriter.WriteLine($"internal static RouteHandlerBuilder {endpoint.HttpMethod}_{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 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 fee3244965a8..e3d46a6e8f59 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -178,7 +178,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 26, 5)] - internal static RouteHandlerBuilder MapGet_265( + internal static RouteHandlerBuilder MapGet_26_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -273,7 +273,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapGet_275( + internal static RouteHandlerBuilder MapGet_27_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -390,7 +390,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 28, 5)] - internal static RouteHandlerBuilder MapGet_285( + internal static RouteHandlerBuilder MapGet_28_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -485,7 +485,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 29, 5)] - internal static RouteHandlerBuilder MapGet_295( + internal static RouteHandlerBuilder MapGet_29_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -602,7 +602,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 30, 5)] - internal static RouteHandlerBuilder MapGet_305( + internal static RouteHandlerBuilder MapGet_30_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -697,7 +697,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 31, 5)] - internal static RouteHandlerBuilder MapGet_315( + internal static RouteHandlerBuilder MapGet_31_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -814,7 +814,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 32, 5)] - internal static RouteHandlerBuilder MapGet_325( + internal static RouteHandlerBuilder MapGet_32_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -909,7 +909,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 33, 5)] - internal static RouteHandlerBuilder MapGet_335( + internal static RouteHandlerBuilder MapGet_33_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1025,7 +1025,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 34, 5)] - internal static RouteHandlerBuilder MapGet_345( + internal static RouteHandlerBuilder MapGet_34_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1119,7 +1119,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 35, 5)] - internal static RouteHandlerBuilder MapGet_355( + internal static RouteHandlerBuilder MapGet_35_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1235,7 +1235,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 36, 5)] - internal static RouteHandlerBuilder MapGet_365( + internal static RouteHandlerBuilder MapGet_36_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1329,7 +1329,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 37, 5)] - internal static RouteHandlerBuilder MapGet_375( + internal static RouteHandlerBuilder MapGet_37_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1446,7 +1446,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 38, 5)] - internal static RouteHandlerBuilder MapGet_385( + internal static RouteHandlerBuilder MapGet_38_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1541,7 +1541,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 39, 5)] - internal static RouteHandlerBuilder MapGet_395( + internal static RouteHandlerBuilder MapGet_39_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1657,7 +1657,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 40, 5)] - internal static RouteHandlerBuilder MapGet_405( + internal static RouteHandlerBuilder MapGet_40_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1751,7 +1751,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 41, 5)] - internal static RouteHandlerBuilder MapGet_415( + internal static RouteHandlerBuilder MapGet_41_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1868,7 +1868,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 42, 5)] - internal static RouteHandlerBuilder MapGet_425( + internal static RouteHandlerBuilder MapGet_42_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1963,7 +1963,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 43, 5)] - internal static RouteHandlerBuilder MapGet_435( + internal static RouteHandlerBuilder MapGet_43_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -2079,7 +2079,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 44, 5)] - internal static RouteHandlerBuilder MapGet_445( + internal static RouteHandlerBuilder MapGet_44_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 32248b533d9f..98ea2de17b2c 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_2513( + internal static RouteHandlerBuilder MapPost_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -159,7 +159,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapPost_275( + internal static RouteHandlerBuilder MapPost_27_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 917b4e58c4c0..30d83b1adfd9 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 ffc3926959fe..c8e798eb8629 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 a82d6e12cb55..0bb682ab171b 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 c46c8b35c746..7832e978442b 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 b6505edbf095..b4e2d6ab54ab 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 f24badbb778c..99c1e60e0fc8 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 0fafe412164e..62ac47187eca 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -155,7 +155,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 26, 5)] - internal static RouteHandlerBuilder MapGet_265( + internal static RouteHandlerBuilder MapGet_26_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -249,7 +249,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapGet_275( + internal static RouteHandlerBuilder MapGet_27_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 cff949f114a7..6e28e536cb08 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 @@ -65,7 +65,7 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 27, 5)] [InterceptsLocation(@"TestMapActions.cs", 28, 5)] [InterceptsLocation(@"TestMapActions.cs", 29, 5)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 5204e7b1038b..273257b7fe8f 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 826077b7c81e..c9529141ce07 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 826077b7c81e..c9529141ce07 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 826077b7c81e..c9529141ce07 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 8b83fb8b858e..7b67d097070a 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 37c4c33d17b3..e1cbb6d554ce 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_2513( + internal static RouteHandlerBuilder MapPost_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 9e42102dc498..a9e7b32eaef8 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 36bf19a9a91e..69d89b08e578 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 1bb2fab7a347..0b8bee8cb9d5 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 1bb2fab7a347..0b8bee8cb9d5 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 396d52ab01fa..b213acba2a2a 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 d720826d37f1..7e3bed124af1 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 5fb9425f353b..9d9f8a4ce125 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 237726cbdb1e..5e441cfff083 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 0fc25bf373db..57d153472bbc 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 6025b64d1adf..6318b59e1c18 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 4299db3c4dbc..8c90aceac70d 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_2513( + internal static RouteHandlerBuilder MapPost_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 0b8148155b2b..612c95986a17 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapMethods_2513( + internal static RouteHandlerBuilder MapMethods_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, IEnumerable httpMethods, 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 0b8148155b2b..612c95986a17 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapMethods_2513( + internal static RouteHandlerBuilder MapMethods_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, IEnumerable httpMethods, 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 0b8148155b2b..612c95986a17 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapMethods_2513( + internal static RouteHandlerBuilder MapMethods_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, IEnumerable httpMethods, 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 0b8148155b2b..612c95986a17 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapMethods_2513( + internal static RouteHandlerBuilder MapMethods_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, IEnumerable httpMethods, 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 0a8a9a8cf094..51f35ec5619d 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_2513( + internal static RouteHandlerBuilder MapPost_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 604c61a4c820..7aef921bb856 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_2513( + internal static RouteHandlerBuilder MapPost_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 830a4cee4a26..09829f10b807 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 @@ -62,7 +62,7 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] [InterceptsLocation(@"TestMapActions.cs", 26, 5)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -149,7 +149,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapGet_275( + internal static RouteHandlerBuilder MapGet_27_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -237,7 +237,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 28, 5)] - internal static RouteHandlerBuilder MapGet_285( + internal static RouteHandlerBuilder MapGet_28_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 86bf91b79ae8..859fee543810 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -152,7 +152,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 26, 5)] - internal static RouteHandlerBuilder MapGet_265( + internal static RouteHandlerBuilder MapGet_26_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -243,7 +243,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapGet_275( + internal static RouteHandlerBuilder MapGet_27_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 81bdf4039296..f0ddbc9df9e6 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 29, 5)] - internal static RouteHandlerBuilder MapPost_295( + internal static RouteHandlerBuilder MapPost_29_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt index daa57c84e977..c1321a237aef 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt @@ -61,8 +61,9 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + [InterceptsLocation(@"TestMapActions.cs", 25, 63)] [InterceptsLocation(@"OtherTestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_2513( + internal static RouteHandlerBuilder MapGet_25_13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 e93afb64a238..9b7dc53afc5f 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 44, 5)] - internal static RouteHandlerBuilder MapGet_445( + internal static RouteHandlerBuilder MapGet_44_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -193,7 +193,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 45, 5)] - internal static RouteHandlerBuilder MapGet_455( + internal static RouteHandlerBuilder MapGet_45_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -318,7 +318,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 46, 5)] - internal static RouteHandlerBuilder MapGet_465( + internal static RouteHandlerBuilder MapGet_46_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -414,7 +414,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 47, 5)] - internal static RouteHandlerBuilder MapPost_475( + internal static RouteHandlerBuilder MapPost_47_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -529,7 +529,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 48, 5)] - internal static RouteHandlerBuilder MapGet_485( + internal static RouteHandlerBuilder MapGet_48_5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs index 79c9d693d057..cc263cc7e78d 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs @@ -46,7 +46,7 @@ public async Task MapAction_ExplicitRouteParamWithInvalidName_SimpleReturn() public async Task SupportsSameInterceptorsFromDifferentFiles() { var project = CreateProject(); - var source = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");"""); + var source = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");app.MapGet("/bye", (string name) => "Bye {name}!");"""); var otherSource = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");""", "OtherTestMapActions"); project = project.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8)).Project; project = project.AddDocument("OtherTestMapActions.cs", SourceText.From(otherSource, Encoding.UTF8)).Project; diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs index 387a601d4f0c..99bfac5bea50 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RequestDelegateCreationTestBase.cs @@ -76,7 +76,7 @@ public abstract class RequestDelegateCreationTestBase : LoggedTest return (Assert.Single(runResult.Results), updatedCompilation); } - internal static RequestDelegateGenerator.StaticRouteHandlerModel.Endpoint GetStaticEndpoint(GeneratorRunResult result, string stepName) => + internal static RequestDelegateGenerator.StaticRouteHandlerModel.Endpoint GetStaticEndpoint(GeneratorRunResult result, string stepName) => Assert.Single(GetStaticEndpoints(result, stepName)); internal static RequestDelegateGenerator.StaticRouteHandlerModel.Endpoint[] GetStaticEndpoints(GeneratorRunResult result, string stepName) @@ -109,14 +109,14 @@ internal static void VerifyStaticEndpointModels(GeneratorRunResult? result, Acti } } - internal Endpoint GetEndpointFromCompilation(Compilation compilation, bool? expectSourceKeyOverride = null, IServiceProvider serviceProvider = null) => - Assert.Single(GetEndpointsFromCompilation(compilation, expectSourceKeyOverride, serviceProvider)); + internal Endpoint GetEndpointFromCompilation(Compilation compilation, bool? expectGeneratedCodeOverride = null, IServiceProvider serviceProvider = null) => + Assert.Single(GetEndpointsFromCompilation(compilation, expectGeneratedCodeOverride, serviceProvider)); - internal Endpoint[] GetEndpointsFromCompilation(Compilation compilation, bool? expectSourceKeyOverride = null, IServiceProvider serviceProvider = null) + internal Endpoint[] GetEndpointsFromCompilation(Compilation compilation, bool? expectGeneratedCodeOverride = null, IServiceProvider serviceProvider = null) { var assemblyName = compilation.AssemblyName!; var symbolsName = Path.ChangeExtension(assemblyName, "pdb"); - var expectSourceKey = (expectSourceKeyOverride ?? true) && IsGeneratorEnabled; + var expectGeneratedCode = (expectGeneratedCodeOverride ?? true) && IsGeneratorEnabled; var output = new MemoryStream(); var pdb = new MemoryStream(); @@ -169,18 +169,18 @@ internal Endpoint[] GetEndpointsFromCompilation(Compilation compilation, bool? e foreach (var endpoint in endpoints) { - var sourceKeyMetadata = endpoint.Metadata.OfType().SingleOrDefault(); + var generatedCodeAttribute = endpoint.Metadata.OfType().SingleOrDefault(); - if (expectSourceKey) + if (expectGeneratedCode) { - Assert.NotNull(sourceKeyMetadata); - var generatedCode = Assert.IsType(sourceKeyMetadata); + Assert.NotNull(generatedCodeAttribute); + var generatedCode = Assert.IsType(generatedCodeAttribute); Assert.Equal(typeof(RequestDelegateGeneratorSources).Assembly.FullName, generatedCode.Tool); Assert.Equal(typeof(RequestDelegateGeneratorSources).Assembly.GetName().Version?.ToString(), generatedCode.Version); } else { - Assert.Null(sourceKeyMetadata); + Assert.Null(generatedCodeAttribute); } } From 0ce39d2eca2a2a57d8e9a73102bdd89de8750605 Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Fri, 7 Jul 2023 13:04:22 -0700 Subject: [PATCH 4/4] Use group index to distinguish interceptor methods --- .../gen/RequestDelegateGenerator.cs | 2 +- ...MapAction_BindAsync_Snapshot.generated.txt | 40 +- ...Param_ComplexReturn_Snapshot.generated.txt | 4 +- ...Header_ComplexTypeArrayParam.generated.txt | 2 +- ...der_NullableStringArrayParam.generated.txt | 2 +- ...licitHeader_StringArrayParam.generated.txt | 2 +- ...tQuery_ComplexTypeArrayParam.generated.txt | 2 +- ...ery_NullableStringArrayParam.generated.txt | 2 +- ...plicitQuery_StringArrayParam.generated.txt | 2 +- ...eParam_SimpleReturn_Snapshot.generated.txt | 6 +- ...Source_SimpleReturn_Snapshot.generated.txt | 2 +- ...tQuery_ComplexTypeArrayParam.generated.txt | 2 +- ...ery_NullableStringArrayParam.generated.txt | 2 +- ...gArrayParam_EmptyQueryValues.generated.txt | 2 +- ...ngArrayParam_QueryNotPresent.generated.txt | 2 +- ...plicitQuery_StringArrayParam.generated.txt | 2 +- ...ce_HandlesBothJsonAndService.generated.txt | 2 +- ...pecialTypeParam_StringReturn.generated.txt | 2 +- ...ipleStringParam_StringReturn.generated.txt | 2 +- ...aram_StringReturn_WithFilter.generated.txt | 2 +- ...n_ReturnsString_Has_Metadata.generated.txt | 2 +- ...ion_ReturnsTodo_Has_Metadata.generated.txt | 2 +- ...onProblemResult_Has_Metadata.generated.txt | 2 +- ..._ReturnsVoid_Has_No_Metadata.generated.txt | 2 +- ...omplexTypeParam_StringReturn.generated.txt | 2 +- ...SingleEnumParam_StringReturn.generated.txt | 2 +- ...ngValueProvided_StringReturn.generated.txt | 2 +- ...MetadataEmitter_Has_Metadata.generated.txt | 2 +- ...AndBody_ShouldUseQueryString.generated.txt | 2 +- ...AndBody_ShouldUseQueryString.generated.txt | 2 +- ...String_AndBody_ShouldUseBody.generated.txt | 2 +- ...String_AndBody_ShouldUseBody.generated.txt | 2 +- ...String_AndBody_ShouldUseBody.generated.txt | 2 +- ...hArrayQueryString_ShouldFail.generated.txt | 2 +- ...pAction_NoParam_StringReturn.generated.txt | 6 +- ...tion_WithParams_StringReturn.generated.txt | 6 +- ...ateValidateGeneratedFormCode.generated.txt | 2 +- ...InterceptorsFromSameLocation.generated.txt | 533 ++++++++++++++++++ ...terceptorsFromDifferentFiles.generated.txt | 2 +- .../VerifyAsParametersBaseline.generated.txt | 10 +- .../CompileTimeCreationTests.cs | 26 + .../IncrementalValuesProviderExtensions.cs | 12 +- 42 files changed, 635 insertions(+), 74 deletions(-) create mode 100644 src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt diff --git a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs index 8110eef0586b..4935fe93b02a 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs @@ -62,7 +62,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { codeWriter.WriteLine($$"""[InterceptsLocation(@"{{location.File}}", {{location.LineNumber}}, {{location.CharacterNumber}})]"""); } - codeWriter.WriteLine($"internal static RouteHandlerBuilder {endpoint.HttpMethod}_{endpoint.Location.LineNumber}_{endpoint.Location.CharacterNumber}("); + codeWriter.WriteLine($"internal static RouteHandlerBuilder {endpoint.HttpMethod}{endpointWithLocations.Index}("); codeWriter.Indent++; codeWriter.WriteLine("this IEndpointRouteBuilder endpoints,"); // MapFallback overloads that only take a delegate do not need a pattern argument 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 e3d46a6e8f59..5021eb7bdabe 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -178,7 +178,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 26, 5)] - internal static RouteHandlerBuilder MapGet_26_5( + internal static RouteHandlerBuilder MapGet1( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -273,7 +273,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapGet_27_5( + internal static RouteHandlerBuilder MapGet2( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -390,7 +390,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 28, 5)] - internal static RouteHandlerBuilder MapGet_28_5( + internal static RouteHandlerBuilder MapGet3( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -485,7 +485,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 29, 5)] - internal static RouteHandlerBuilder MapGet_29_5( + internal static RouteHandlerBuilder MapGet4( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -602,7 +602,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 30, 5)] - internal static RouteHandlerBuilder MapGet_30_5( + internal static RouteHandlerBuilder MapGet5( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -697,7 +697,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 31, 5)] - internal static RouteHandlerBuilder MapGet_31_5( + internal static RouteHandlerBuilder MapGet6( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -814,7 +814,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 32, 5)] - internal static RouteHandlerBuilder MapGet_32_5( + internal static RouteHandlerBuilder MapGet7( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -909,7 +909,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 33, 5)] - internal static RouteHandlerBuilder MapGet_33_5( + internal static RouteHandlerBuilder MapGet8( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1025,7 +1025,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 34, 5)] - internal static RouteHandlerBuilder MapGet_34_5( + internal static RouteHandlerBuilder MapGet9( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1119,7 +1119,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 35, 5)] - internal static RouteHandlerBuilder MapGet_35_5( + internal static RouteHandlerBuilder MapGet10( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1235,7 +1235,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 36, 5)] - internal static RouteHandlerBuilder MapGet_36_5( + internal static RouteHandlerBuilder MapGet11( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1329,7 +1329,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 37, 5)] - internal static RouteHandlerBuilder MapGet_37_5( + internal static RouteHandlerBuilder MapGet12( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1446,7 +1446,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 38, 5)] - internal static RouteHandlerBuilder MapGet_38_5( + internal static RouteHandlerBuilder MapGet13( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1541,7 +1541,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 39, 5)] - internal static RouteHandlerBuilder MapGet_39_5( + internal static RouteHandlerBuilder MapGet14( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1657,7 +1657,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 40, 5)] - internal static RouteHandlerBuilder MapGet_40_5( + internal static RouteHandlerBuilder MapGet15( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1751,7 +1751,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 41, 5)] - internal static RouteHandlerBuilder MapGet_41_5( + internal static RouteHandlerBuilder MapGet16( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1868,7 +1868,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 42, 5)] - internal static RouteHandlerBuilder MapGet_42_5( + internal static RouteHandlerBuilder MapGet17( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -1963,7 +1963,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 43, 5)] - internal static RouteHandlerBuilder MapGet_43_5( + internal static RouteHandlerBuilder MapGet18( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -2079,7 +2079,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 44, 5)] - internal static RouteHandlerBuilder MapGet_44_5( + internal static RouteHandlerBuilder MapGet19( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 98ea2de17b2c..8f5c0a9c8312 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_25_13( + internal static RouteHandlerBuilder MapPost0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -159,7 +159,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapPost_27_5( + internal static RouteHandlerBuilder MapPost1( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 30d83b1adfd9..eb4df4df33d2 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 c8e798eb8629..d539c6b82595 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 0bb682ab171b..882ceff0f9a6 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 7832e978442b..a8f4c853247a 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 b4e2d6ab54ab..0214e724ea87 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 99c1e60e0fc8..77f229223a1f 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 62ac47187eca..ad462c66892c 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -155,7 +155,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 26, 5)] - internal static RouteHandlerBuilder MapGet_26_5( + internal static RouteHandlerBuilder MapGet1( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -249,7 +249,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapGet_27_5( + internal static RouteHandlerBuilder MapGet2( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 6e28e536cb08..7cc783403b56 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 @@ -65,7 +65,7 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 27, 5)] [InterceptsLocation(@"TestMapActions.cs", 28, 5)] [InterceptsLocation(@"TestMapActions.cs", 29, 5)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 273257b7fe8f..dc42d2479ede 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 c9529141ce07..3c96dad2f203 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 c9529141ce07..3c96dad2f203 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 c9529141ce07..3c96dad2f203 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 7b67d097070a..308fde329038 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 e1cbb6d554ce..90440ce05d59 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_25_13( + internal static RouteHandlerBuilder MapPost0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 a9e7b32eaef8..0618a6e4b066 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 69d89b08e578..d4cacea41406 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 0b8bee8cb9d5..5dceb4807e22 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 0b8bee8cb9d5..5dceb4807e22 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 b213acba2a2a..ef489161717a 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 7e3bed124af1..107eefd1973b 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 9d9f8a4ce125..bdcfa2c1ffc2 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 5e441cfff083..9a6e88d6150b 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 57d153472bbc..bc40b644a055 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 6318b59e1c18..3945202ac74f 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 8c90aceac70d..6364add60bf9 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_25_13( + internal static RouteHandlerBuilder MapPost0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 612c95986a17..aec0a796dc5e 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapMethods_25_13( + internal static RouteHandlerBuilder MapMethods0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, IEnumerable httpMethods, 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 612c95986a17..aec0a796dc5e 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapMethods_25_13( + internal static RouteHandlerBuilder MapMethods0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, IEnumerable httpMethods, 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 612c95986a17..aec0a796dc5e 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapMethods_25_13( + internal static RouteHandlerBuilder MapMethods0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, IEnumerable httpMethods, 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 612c95986a17..aec0a796dc5e 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapMethods_25_13( + internal static RouteHandlerBuilder MapMethods0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, IEnumerable httpMethods, 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 51f35ec5619d..bf3102bd3d13 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_25_13( + internal static RouteHandlerBuilder MapPost0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 7aef921bb856..51acd4642fc2 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapPost_25_13( + internal static RouteHandlerBuilder MapPost0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 09829f10b807..a2e7d52e5520 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 @@ -62,7 +62,7 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] [InterceptsLocation(@"TestMapActions.cs", 26, 5)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -149,7 +149,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapGet_27_5( + internal static RouteHandlerBuilder MapGet1( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -237,7 +237,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 28, 5)] - internal static RouteHandlerBuilder MapGet_28_5( + internal static RouteHandlerBuilder MapGet2( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 859fee543810..69bfc73cf152 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 @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -152,7 +152,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 26, 5)] - internal static RouteHandlerBuilder MapGet_26_5( + internal static RouteHandlerBuilder MapGet1( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -243,7 +243,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 27, 5)] - internal static RouteHandlerBuilder MapGet_27_5( + internal static RouteHandlerBuilder MapGet2( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 f0ddbc9df9e6..1d435bd534cb 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 29, 5)] - internal static RouteHandlerBuilder MapPost_29_5( + internal static RouteHandlerBuilder MapPost0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt new file mode 100644 index 000000000000..0d80cde20ddc --- /dev/null +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt @@ -0,0 +1,533 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +#nullable enable + +namespace System.Runtime.CompilerServices +{ + %GENERATEDCODEATTRIBUTE% + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute + { + public InterceptsLocationAttribute(string filePath, int line, int column) + { + } + } +} + +namespace Microsoft.AspNetCore.Http.Generated +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using System.Globalization; + using System.Linq; + using System.Reflection; + using System.Runtime.CompilerServices; + using System.Text.Json; + using System.Text.Json.Serialization.Metadata; + using System.Threading.Tasks; + using System.IO; + using Microsoft.AspNetCore.Routing; + using Microsoft.AspNetCore.Routing.Patterns; + using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Http; + using Microsoft.AspNetCore.Http.Json; + using Microsoft.AspNetCore.Http.Metadata; + using Microsoft.Extensions.DependencyInjection; + using Microsoft.Extensions.FileProviders; + using Microsoft.Extensions.Logging; + using Microsoft.Extensions.Primitives; + using Microsoft.Extensions.Options; + + using MetadataPopulator = System.Func; + using RequestDelegateFactoryFunc = System.Func; + + %GENERATEDCODEATTRIBUTE% + file static class GeneratedRouteBuilderExtensionsCore + { + 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 MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var name_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("name", options.RouteParameterNames); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: name (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery) + var name_raw = name_RouteOrQueryResolver(httpContext); + if (name_raw is StringValues { Count: 0 }) + { + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "name", "route or query string"); + } + var name_temp = (string?)name_raw; + string name_local = name_temp!; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(name_local!); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + return httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: name (Type = string, IsOptional = False, IsParsable = False, IsArray = False, Source = RouteOrQuery) + var name_raw = name_RouteOrQueryResolver(httpContext); + if (name_raw is StringValues { Count: 0 }) + { + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("string", "name", "route or query string"); + } + var name_temp = (string?)name_raw; + string name_local = name_temp!; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, name_local!)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"OtherTestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet1( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.Int32 arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var age_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("age", options.RouteParameterNames); + + if (options.EndpointBuilder.FilterFactories.Count > 0) + { + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) + { + return ValueTask.FromResult(Results.Empty); + } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: age (Type = int, IsOptional = False, IsParsable = True, IsArray = False, Source = RouteOrQuery) + var age_raw = age_RouteOrQueryResolver(httpContext); + if (age_raw is StringValues { Count: 0 }) + { + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("int", "age", "route or query string"); + } + var age_temp = (string?)age_raw; + if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(age_temp!, CultureInfo.InvariantCulture, out var age_parsed_temp)) + { + if (!string.IsNullOrEmpty(age_temp)) + { + logOrThrowExceptionHelper.ParameterBindingFailed("int", "age", age_temp); + wasParamCheckFailure = true; + } + } + int age_local = age_parsed_temp!; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return Task.CompletedTask; + } + var result = handler(age_local!); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + return httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: age (Type = int, IsOptional = False, IsParsable = True, IsArray = False, Source = RouteOrQuery) + var age_raw = age_RouteOrQueryResolver(httpContext); + if (age_raw is StringValues { Count: 0 }) + { + wasParamCheckFailure = true; + logOrThrowExceptionHelper.RequiredParameterNotProvided("int", "age", "route or query string"); + } + var age_temp = (string?)age_raw; + if (!GeneratedRouteBuilderExtensionsCore.TryParseExplicit(age_temp!, CultureInfo.InvariantCulture, out var age_parsed_temp)) + { + if (!string.IsNullOrEmpty(age_temp)) + { + logOrThrowExceptionHelper.ParameterBindingFailed("int", "age", age_temp); + wasParamCheckFailure = true; + } + } + int age_local = age_parsed_temp!; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, age_local!)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } + + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + + + internal static RouteHandlerBuilder MapCore( + this IEndpointRouteBuilder routes, + string pattern, + Delegate handler, + IEnumerable? 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) + { + var routeHandlerFilters = builder.FilterFactories; + var context0 = new EndpointFilterFactoryContext + { + MethodInfo = mi, + ApplicationServices = builder.ApplicationServices, + }; + var initialFilteredInvocation = filteredInvocation; + for (var i = routeHandlerFilters.Count - 1; i >= 0; i--) + { + var filterFactory = routeHandlerFilters[i]; + filteredInvocation = filterFactory(context0, filteredInvocation); + } + return filteredInvocation; + } + + private static Task ExecuteReturnAsync(object? obj, HttpContext httpContext, JsonTypeInfo jsonTypeInfo) + { + if (obj is IResult r) + { + return r.ExecuteAsync(httpContext); + } + else if (obj is string s) + { + return httpContext.Response.WriteAsync(s); + } + else + { + return WriteJsonResponseAsync(httpContext.Response, obj, jsonTypeInfo); + } + } + + [UnconditionalSuppressMessage("Trimming", "IL2026:RequiresUnreferencedCode", + Justification = "The 'JsonSerializer.IsReflectionEnabledByDefault' feature switch, which is set to false by default for trimmed ASP.NET apps, ensures the JsonSerializer doesn't use Reflection.")] + [UnconditionalSuppressMessage("AOT", "IL3050:RequiresDynamicCode", Justification = "See above.")] + private static Task WriteJsonResponseAsync(HttpResponse response, T? value, JsonTypeInfo jsonTypeInfo) + { + var runtimeType = value?.GetType(); + + if (jsonTypeInfo.ShouldUseWith(runtimeType)) + { + return HttpResponseJsonExtensions.WriteAsJsonAsync(response, value, jsonTypeInfo, default); + } + + return response.WriteAsJsonAsync(value, jsonTypeInfo.Options); + } + + private static bool HasKnownPolymorphism(this JsonTypeInfo jsonTypeInfo) + => jsonTypeInfo.Type.IsSealed || jsonTypeInfo.Type.IsValueType || jsonTypeInfo.PolymorphismOptions is not null; + + private static bool ShouldUseWith(this JsonTypeInfo jsonTypeInfo, [NotNullWhen(false)] Type? runtimeType) + => runtimeType is null || jsonTypeInfo.Type == runtimeType || jsonTypeInfo.HasKnownPolymorphism(); + + private static Func ResolveFromRouteOrQuery(string parameterName, IEnumerable? routeParameterNames) + { + return routeParameterNames?.Contains(parameterName, StringComparer.OrdinalIgnoreCase) == true + ? (httpContext) => new StringValues((string?)httpContext.Request.RouteValues[parameterName]) + : (httpContext) => httpContext.Request.Query[parameterName]; + } + private static bool TryParseExplicit(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) where T: IParsable + => T.TryParse(s, provider, out result); + + } + + %GENERATEDCODEATTRIBUTE% + file static class GeneratedMetadataConstants + { + public static readonly string[] JsonContentType = new [] { "application/json" }; + public static readonly string[] PlaintextContentType = new [] { "text/plain" }; + public static readonly string[] FormFileContentType = new[] { "multipart/form-data" }; + public static readonly string[] FormContentType = new[] { "multipart/form-data", "application/x-www-form-urlencoded" }; + } + + + %GENERATEDCODEATTRIBUTE% + file sealed class LogOrThrowExceptionHelper + { + private readonly ILogger? _rdgLogger; + private readonly bool _shouldThrow; + + public LogOrThrowExceptionHelper(IServiceProvider? serviceProvider, RequestDelegateFactoryOptions? options) + { + var loggerFactory = serviceProvider?.GetRequiredService(); + _rdgLogger = loggerFactory?.CreateLogger("Microsoft.AspNetCore.Http.RequestDelegateGenerator.RequestDelegateGenerator"); + _shouldThrow = options?.ThrowOnBadRequest ?? false; + } + + public void RequestBodyIOException(IOException exception) + { + if (_rdgLogger != null) + { + _requestBodyIOException(_rdgLogger, exception); + } + } + + private static readonly Action _requestBodyIOException = + LoggerMessage.Define(LogLevel.Debug, new EventId(1, "RequestBodyIOException"), "Reading the request body failed with an IOException."); + + public void InvalidJsonRequestBody(string parameterTypeName, string parameterName, Exception exception) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Failed to read parameter \"{0} {1}\" from the request body as JSON.", parameterTypeName, parameterName); + throw new BadHttpRequestException(message, exception); + } + + if (_rdgLogger != null) + { + _invalidJsonRequestBody(_rdgLogger, parameterTypeName, parameterName, exception); + } + } + + private static readonly Action _invalidJsonRequestBody = + LoggerMessage.Define(LogLevel.Debug, new EventId(2, "InvalidJsonRequestBody"), "Failed to read parameter \"{ParameterType} {ParameterName}\" from the request body as JSON."); + + public void ParameterBindingFailed(string parameterTypeName, string parameterName, string sourceValue) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Failed to bind parameter \"{0} {1}\" from \"{2}\".", parameterTypeName, parameterName, sourceValue); + throw new BadHttpRequestException(message); + } + + if (_rdgLogger != null) + { + _parameterBindingFailed(_rdgLogger, parameterTypeName, parameterName, sourceValue, null); + } + } + + private static readonly Action _parameterBindingFailed = + LoggerMessage.Define(LogLevel.Debug, new EventId(3, "ParameterBindingFailed"), "Failed to bind parameter \"{ParameterType} {ParameterName}\" from \"{SourceValue}\"."); + + public void RequiredParameterNotProvided(string parameterTypeName, string parameterName, string source) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Required parameter \"{0} {1}\" was not provided from {2}.", parameterTypeName, parameterName, source); + throw new BadHttpRequestException(message); + } + + if (_rdgLogger != null) + { + _requiredParameterNotProvided(_rdgLogger, parameterTypeName, parameterName, source, null); + } + } + + private static readonly Action _requiredParameterNotProvided = + LoggerMessage.Define(LogLevel.Debug, new EventId(4, "RequiredParameterNotProvided"), "Required parameter \"{ParameterType} {ParameterName}\" was not provided from {Source}."); + + public void ImplicitBodyNotProvided(string parameterName) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Implicit body inferred for parameter \"{0}\" but no body was provided. Did you mean to use a Service instead?", parameterName); + throw new BadHttpRequestException(message); + } + + if (_rdgLogger != null) + { + _implicitBodyNotProvided(_rdgLogger, parameterName, null); + } + } + + private static readonly Action _implicitBodyNotProvided = + LoggerMessage.Define(LogLevel.Debug, new EventId(5, "ImplicitBodyNotProvided"), "Implicit body inferred for parameter \"{ParameterName}\" but no body was provided. Did you mean to use a Service instead?"); + + public void UnexpectedJsonContentType(string? contentType) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Expected a supported JSON media type but got \"{0}\".", contentType); + throw new BadHttpRequestException(message, StatusCodes.Status415UnsupportedMediaType); + } + + if (_rdgLogger != null) + { + _unexpectedJsonContentType(_rdgLogger, contentType ?? "(none)", null); + } + } + + private static readonly Action _unexpectedJsonContentType = + LoggerMessage.Define(LogLevel.Debug, new EventId(6, "UnexpectedContentType"), "Expected a supported JSON media type but got \"{ContentType}\"."); + + public void UnexpectedNonFormContentType(string? contentType) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Expected a supported form media type but got \"{0}\".", contentType); + throw new BadHttpRequestException(message, StatusCodes.Status415UnsupportedMediaType); + } + + if (_rdgLogger != null) + { + _unexpectedNonFormContentType(_rdgLogger, contentType ?? "(none)", null); + } + } + + private static readonly Action _unexpectedNonFormContentType = + LoggerMessage.Define(LogLevel.Debug, new EventId(7, "UnexpectedNonFormContentType"), "Expected a supported form media type but got \"{ContentType}\"."); + + public void InvalidFormRequestBody(string parameterTypeName, string parameterName, Exception exception) + { + if (_shouldThrow) + { + var message = string.Format(CultureInfo.InvariantCulture, "Failed to read parameter \"{0} {1}\" from the request body as form.", parameterTypeName, parameterName); + throw new BadHttpRequestException(message, exception); + } + + if (_rdgLogger != null) + { + _invalidFormRequestBody(_rdgLogger, parameterTypeName, parameterName, exception); + } + } + + private static readonly Action _invalidFormRequestBody = + LoggerMessage.Define(LogLevel.Debug, new EventId(8, "InvalidFormRequestBody"), "Failed to read parameter \"{ParameterType} {ParameterName}\" from the request body as form."); + } +} diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt index c1321a237aef..877cde94f593 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt @@ -63,7 +63,7 @@ namespace Microsoft.AspNetCore.Http.Generated [InterceptsLocation(@"TestMapActions.cs", 25, 13)] [InterceptsLocation(@"TestMapActions.cs", 25, 63)] [InterceptsLocation(@"OtherTestMapActions.cs", 25, 13)] - internal static RouteHandlerBuilder MapGet_25_13( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) 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 9b7dc53afc5f..022910bbadb3 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Http.Generated private static readonly string[] PatchVerb = new[] { Microsoft.AspNetCore.Http.HttpMethods.Patch }; [InterceptsLocation(@"TestMapActions.cs", 44, 5)] - internal static RouteHandlerBuilder MapGet_44_5( + internal static RouteHandlerBuilder MapGet0( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -193,7 +193,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 45, 5)] - internal static RouteHandlerBuilder MapGet_45_5( + internal static RouteHandlerBuilder MapGet1( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -318,7 +318,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 46, 5)] - internal static RouteHandlerBuilder MapGet_46_5( + internal static RouteHandlerBuilder MapGet2( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -414,7 +414,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 47, 5)] - internal static RouteHandlerBuilder MapPost_47_5( + internal static RouteHandlerBuilder MapPost3( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) @@ -529,7 +529,7 @@ namespace Microsoft.AspNetCore.Http.Generated } [InterceptsLocation(@"TestMapActions.cs", 48, 5)] - internal static RouteHandlerBuilder MapGet_48_5( + internal static RouteHandlerBuilder MapGet4( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, Delegate handler) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs index cc263cc7e78d..f17e16777d64 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs @@ -68,6 +68,32 @@ public async Task SupportsSameInterceptorsFromDifferentFiles() await VerifyAgainstBaselineUsingFile(updatedCompilation); } + [Fact] + public async Task SupportsDifferentInterceptorsFromSameLocation() + { + var project = CreateProject(); + var source = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");"""); + var otherSource = GetMapActionString("""app.MapGet("/", (int age) => "Hello {age}!");""", "OtherTestMapActions"); + project = project.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8)).Project; + project = project.AddDocument("OtherTestMapActions.cs", SourceText.From(otherSource, Encoding.UTF8)).Project; + var compilation = await project.GetCompilationAsync(); + + var generator = new RequestDelegateGenerator.RequestDelegateGenerator().AsSourceGenerator(); + GeneratorDriver driver = CSharpGeneratorDriver.Create(generators: new[] + { + generator + }, + driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true), + parseOptions: ParseOptions); + driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation, + out var _); + + var diagnostics = updatedCompilation.GetDiagnostics(); + Assert.Empty(diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Warning)); + + await VerifyAgainstBaselineUsingFile(updatedCompilation); + } + [Fact] public async Task SourceMapsAllPathsInAttribute() { diff --git a/src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs b/src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs index 23466c6728ba..ff0e1772f56b 100644 --- a/src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs +++ b/src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs @@ -8,7 +8,7 @@ internal static class IncrementalValuesProviderExtensions { - public static IncrementalValuesProvider<(TSource Source, ImmutableArray Elements)> GroupWith( + public static IncrementalValuesProvider<(TSource Source, int Index, ImmutableArray Elements)> GroupWith( this IncrementalValuesProvider source, Func sourceToElementTransform, IEqualityComparer comparer) @@ -25,11 +25,13 @@ internal static class IncrementalValuesProviderExtensions } builder.Add(sourceToElementTransform(value)); } - ImmutableArray<(TSource Key, ImmutableArray Elements)>.Builder result = - ImmutableArray.CreateBuilder<(TSource, ImmutableArray)>(); - foreach (KeyValuePair.Builder> entry in map) + ImmutableArray<(TSource Key, int Index, ImmutableArray Elements)>.Builder result = + ImmutableArray.CreateBuilder<(TSource, int, ImmutableArray)>(); + var index = 0; + foreach (var entry in map) { - result.Add((entry.Key, entry.Value.ToImmutable())); + result.Add((entry.Key, index, entry.Value.ToImmutable())); + index++; } return result; });