diff --git a/eng/Versions.props b/eng/Versions.props index bd6fecc499eb..7f96f3f20d87 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -245,7 +245,7 @@ 3.3.1 - 4.5.0 + 4.7.0-3.23314.3 4.7.0-3.23314.3 4.7.0-3.23314.3 4.7.0-3.23314.3 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 8ea0aa0c1ec9..32be44e7b8c1 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGenerator.cs @@ -27,10 +27,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); } @@ -56,117 +53,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) - { - 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 interceptorDefinitions = endpoints + .GroupWith((endpoint) => endpoint.Location, EndpointDelegateComparer.Instance) + .Select((endpointWithLocations, _) => { - var dedupedByDelegate = endpoints.Distinct(EndpointDelegateComparer.Instance); + var endpoint = endpointWithLocations.Source; using var stringWriter = new StringWriter(CultureInfo.InvariantCulture); using var codeWriter = new CodeWriter(stringWriter, baseIndent: 2); - foreach (var endpoint in dedupedByDelegate) + foreach (var location in endpointWithLocations.Elements) { - codeWriter.WriteLine($"internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder {endpoint.HttpMethod}("); - codeWriter.Indent++; - codeWriter.WriteLine("this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints,"); - // MapFallback overloads that only take a delegate do not need a pattern argument - if (endpoint.HttpMethod != "MapFallback" || endpoint.Operation.Arguments.Length != 2) - { - codeWriter.WriteLine(@"[global::System.Diagnostics.CodeAnalysis.StringSyntax(""Route"")] string pattern,"); - } - // MapMethods overloads define an additional `httpMethods` parameter - if (endpoint.HttpMethod == "MapMethods") - { - codeWriter.WriteLine("global::System.Collections.Generic.IEnumerable httpMethods,"); - } - codeWriter.WriteLine($"global::{endpoint.EmitHandlerDelegateType()} handler,"); - codeWriter.WriteLine(@"[global::System.Runtime.CompilerServices.CallerFilePath] string filePath = """","); - codeWriter.WriteLine("[global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0)"); - codeWriter.Indent--; - codeWriter.StartBlock(); - codeWriter.WriteLine("return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore("); - codeWriter.Indent++; - codeWriter.WriteLine("endpoints,"); - // For `MapFallback` overloads that only take a delegate, provide the assumed default - // Otherwise, pass the pattern provided from the MapX invocation - if (endpoint.HttpMethod != "MapFallback" && endpoint.Operation.Arguments.Length != 2) - { - codeWriter.WriteLine("pattern,"); - } - else - { - codeWriter.WriteLine($"{SymbolDisplay.FormatLiteral("{*path:nonfile}", true)},"); - } - codeWriter.WriteLine("handler,"); - codeWriter.WriteLine($"{endpoint.EmitVerb()},"); - codeWriter.WriteLine("filePath,"); - codeWriter.WriteLine("lineNumber);"); - codeWriter.Indent--; - codeWriter.EndBlock(); + codeWriter.WriteLine($$"""[InterceptsLocation(@"{{location.File}}", {{location.LineNumber}}, {{location.CharacterNumber}})]"""); } - + codeWriter.WriteLine($"internal static RouteHandlerBuilder {endpoint.HttpMethod}{endpointWithLocations.Index}("); + codeWriter.Indent++; + codeWriter.WriteLine("this IEndpointRouteBuilder endpoints,"); + // MapFallback overloads that only take a delegate do not need a pattern argument + if (endpoint.HttpMethod != "MapFallback" || endpoint.Operation.Arguments.Length != 2) + { + codeWriter.WriteLine(@"[StringSyntax(""Route"")] string pattern,"); + } + // MapMethods overloads define an additional `httpMethods` parameter + if (endpoint.HttpMethod == "MapMethods") + { + codeWriter.WriteLine("IEnumerable httpMethods,"); + } + codeWriter.WriteLine("Delegate handler)"); + codeWriter.Indent--; + codeWriter.StartBlock(); + codeWriter.WriteLine("MetadataPopulator populateMetadata = (methodInfo, options) =>"); + codeWriter.StartBlock(); + codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");"); + codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");"); + codeWriter.WriteLine($"options.EndpointBuilder.Metadata.Add(new {RequestDelegateGeneratorSources.GeneratedCodeConstructor});"); + endpoint.EmitEndpointMetadataPopulation(codeWriter); + codeWriter.WriteLine("return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() };"); + codeWriter.EndBlockWithSemicolon(); + codeWriter.WriteLine("RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) =>"); + codeWriter.StartBlock(); + codeWriter.WriteLine(@"Debug.Assert(options != null, ""RequestDelegateFactoryOptions not found."");"); + codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder != null, ""EndpointBuilder not found."");"); + codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.ApplicationServices != null, ""ApplicationServices not found."");"); + codeWriter.WriteLine(@"Debug.Assert(options.EndpointBuilder.FilterFactories != null, ""FilterFactories not found."");"); + codeWriter.WriteLine($"var handler = Cast(del, {endpoint.EmitHandlerDelegateType(considerOptionality: true)} => throw null!);"); + codeWriter.WriteLine("EndpointFilterDelegate? filteredInvocation = null;"); + codeWriter.WriteLine("var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices;"); + endpoint.EmitLoggingPreamble(codeWriter); + endpoint.EmitJsonPreparation(codeWriter); + endpoint.EmitRouteOrQueryResolver(codeWriter); + endpoint.EmitJsonBodyOrServiceResolver(codeWriter); + if (endpoint.NeedsParameterArray) + { + codeWriter.WriteLine("var parameters = del.Method.GetParameters();"); + } + codeWriter.WriteLineNoTabs(string.Empty); + codeWriter.WriteLine("if (options.EndpointBuilder.FilterFactories.Count > 0)"); + codeWriter.StartBlock(); + codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true + ? "filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(async ic =>" + : "filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic =>"); + codeWriter.StartBlock(); + codeWriter.WriteLine("if (ic.HttpContext.Response.StatusCode == 400)"); + codeWriter.StartBlock(); + codeWriter.WriteLine(endpoint.Response?.IsAwaitable == true + ? "return (object?)Results.Empty;" + : "return ValueTask.FromResult(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 MapCore("); + codeWriter.Indent++; + codeWriter.WriteLine("endpoints,"); + // For `MapFallback` overloads that only take a delegate, provide the assumed default + // Otherwise, pass the pattern provided from the MapX invocation + if (endpoint.HttpMethod != "MapFallback" && endpoint.Operation.Arguments.Length != 2) + { + codeWriter.WriteLine("pattern,"); + } + else + { + codeWriter.WriteLine($"{SymbolDisplay.FormatLiteral("{*path:nonfile}", true)},"); + } + codeWriter.WriteLine("handler,"); + codeWriter.WriteLine($"{endpoint.EmitVerb()},"); + codeWriter.WriteLine("populateMetadata,"); + codeWriter.WriteLine("createRequestDelegate);"); + codeWriter.Indent--; + codeWriter.EndBlock(); return stringWriter.ToString(); }); @@ -272,32 +256,23 @@ public void Initialize(IncrementalGeneratorInitializationContext context) return stringWriter.ToString(); }); - var thunksAndEndpoints = thunks - .Collect() - .Combine(stronglyTypedEndpointDefinitions) - .Combine(httpVerbs) - .Combine(endpointHelpers) - .Combine(helperTypes); + var endpointsAndHelpers = interceptorDefinitions.Collect().Combine(endpointHelpers).Combine(httpVerbs).Combine(helperTypes); - context.RegisterSourceOutput(thunksAndEndpoints, (context, sources) => + context.RegisterSourceOutput(endpointsAndHelpers, (context, sources) => { - var ((((thunks, endpointsCode), httpVerbs), helperMethods), helperTypes) = sources; - - if (thunks.IsDefaultOrEmpty || string.IsNullOrEmpty(endpointsCode)) + var (((endpointsCode, helperMethods), httpVerbs), helperTypes) = sources; + if (endpointsCode.IsDefaultOrEmpty) { return; } - - var thunksCode = new StringBuilder(); - foreach (var thunk in thunks) + using var stringWriter = new StringWriter(CultureInfo.InvariantCulture); + using var codeWriter = new CodeWriter(stringWriter, baseIndent: 2); + foreach (var endpoint in endpointsCode) { - thunksCode.AppendLine(thunk); + codeWriter.WriteLine(endpoint); } - var code = RequestDelegateGeneratorSources.GetGeneratedRouteBuilderExtensionsSource( - genericThunks: string.Empty, - thunks: thunksCode.ToString(), - endpoints: endpointsCode, + endpoints: stringWriter.ToString(), helperMethods: helperMethods ?? string.Empty, helperTypes: helperTypes ?? string.Empty, verbs: httpVerbs); diff --git a/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs index 7b246eeb1365..a85c34fd324d 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.Collections.Immutable; using System.Linq; using System.Text; @@ -21,7 +22,8 @@ internal static class RequestDelegateGeneratorSources #nullable enable """; - public static string GeneratedCodeAttribute => $@"[System.CodeDom.Compiler.GeneratedCodeAttribute(""{typeof(RequestDelegateGeneratorSources).Assembly.FullName}"", ""{typeof(RequestDelegateGeneratorSources).Assembly.GetName().Version}"")]"; + public static string GeneratedCodeConstructor => $@"System.CodeDom.Compiler.GeneratedCodeAttribute(""{typeof(RequestDelegateGeneratorSources).Assembly.FullName}"", ""{typeof(RequestDelegateGeneratorSources).Assembly.GetName().Version}"")"; + public static string GeneratedCodeAttribute => $"[{GeneratedCodeConstructor}]"; public static string ContentTypeConstantsType => $$""" {{GeneratedCodeAttribute}} @@ -439,25 +441,19 @@ public override bool IsDefined(Type attributeType, bool inherit) } """; - public static string GetGeneratedRouteBuilderExtensionsSource(string genericThunks, string thunks, string endpoints, string helperMethods, string helperTypes, ImmutableHashSet verbs) => $$""" + public static string GetGeneratedRouteBuilderExtensionsSource(string endpoints, string helperMethods, string helperTypes, ImmutableHashSet verbs) => $$""" {{SourceHeader}} -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { {{GeneratedCodeAttribute}} - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - -{{GetEndpoints(endpoints, verbs)}} } namespace Microsoft.AspNetCore.Http.Generated @@ -471,6 +467,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -493,8 +490,24 @@ namespace Microsoft.AspNetCore.Http.Generated {{GeneratedCodeAttribute}} file static class GeneratedRouteBuilderExtensionsCore { -{{GetGenericThunks(genericThunks)}} -{{GetThunks(thunks)}} + {{GetVerbs(verbs)}} + {{endpoints}} + + internal static RouteHandlerBuilder MapCore( + this IEndpointRouteBuilder routes, + string pattern, + Delegate handler, + IEnumerable? 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) { @@ -557,84 +570,16 @@ 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, ImmutableHashSet verbs) + public static string GetVerbs(ImmutableHashSet verbs) { - if (endpoints == string.Empty) - { - return string.Empty; - } - var builder = new StringBuilder(); - builder.Append($$""" - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - {{GeneratedCodeAttribute}} - internal static class GenerateRouteBuilderEndpoints - { - -"""); - foreach (string verb in verbs.OrderBy(p => p, System.StringComparer.Ordinal)) + foreach (string verb in verbs.OrderBy(p => p, StringComparer.Ordinal)) { - builder.AppendLine($$""" - private static readonly string[] {{verb}}Verb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.{{verb}} }; -"""); + builder.AppendLine($$"""private static readonly string[] {{verb}}Verb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.{{verb}} };"""); } - if (verbs.Count > 0) - { - builder.AppendLine(); - } - - builder.Append($$""" - {{endpoints}} - } -"""); - return builder.ToString(); } } 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 41095fb20958..3da3b64c5e92 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 25fc348f1290..bbe3dc588051 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,332 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -348,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -370,1856 +54,2138 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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.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.MyBindAsyncRecord.BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncRecord", "myBindAsyncParam", "MyBindAsyncRecord.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + else { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[1]); - global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncRecord", "myBindAsyncParam", "MyBindAsyncRecord.BindAsync(HttpContext, ParameterInfo)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord)myBindAsyncParam_temp; - } + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord)myBindAsyncParam_temp; + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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.MyBindAsyncRecord.BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncRecord", "myBindAsyncParam", "MyBindAsyncRecord.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; } - - async Task RequestHandler(HttpContext httpContext) + else { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord)myBindAsyncParam_temp; } - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - 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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet1( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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.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.MyBindAsyncRecord.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?)myBindAsyncParam_temp; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[1]); - global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncStruct", "myBindAsyncParam", "MyBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct)myBindAsyncParam_temp; - } - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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", 28)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 28)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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.MyBindAsyncRecord.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncRecord?)myBindAsyncParam_temp; - async Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + httpContext.Response.StatusCode = 400; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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", 29)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 29)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet2( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]); - global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp; + return ValueTask.FromResult(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.MyBindAsyncStruct.BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncStruct", "myBindAsyncParam", "MyBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + else { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]); - global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp; - } + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct)myBindAsyncParam_temp; + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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", 30)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 30)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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.MyBindAsyncStruct.BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBindAsyncStruct", "myBindAsyncParam", "MyBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct)myBindAsyncParam_temp; } - async Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp; + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) + { + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 28, 5)] + internal static RouteHandlerBuilder MapGet3( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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) { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + return ValueTask.FromResult(Results.Empty); } - await httpContext.Response.WriteAsync(result); + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncStruct?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp; + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, 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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 29, 5)] + internal static RouteHandlerBuilder MapGet4( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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) { - 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); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp; } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 31)] = ( - (methodInfo, options) => + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 31)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 30, 5)] + internal static RouteHandlerBuilder MapGet5( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct?)myBindAsyncParam_temp; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[1]); - global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBothBindAsyncStruct", "myBindAsyncParam", "MyBothBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct)myBindAsyncParam_temp; - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 31, 5)] + internal static RouteHandlerBuilder MapGet6( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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) { - 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", 32)] = ( - (methodInfo, options) => + async Task RequestHandler(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 32)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBothBindAsyncStruct", "myBindAsyncParam", "MyBothBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MyBothBindAsyncStruct", "myBindAsyncParam", "MyBothBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct)myBindAsyncParam_temp; } - async Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp; + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 32, 5)] + internal static RouteHandlerBuilder MapGet7( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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) { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + return ValueTask.FromResult(Results.Empty); } - await httpContext.Response.WriteAsync(result); + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct.BindAsync(httpContext, parameters[0]); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBothBindAsyncStruct?)myBindAsyncParam_temp; + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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, 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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 33, 5)] + internal static RouteHandlerBuilder MapGet8( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext); + global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncRecord", "myBindAsyncParam", "MySimpleBindAsyncRecord.BindAsync(HttpContext)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 33)] = ( - (methodInfo, options) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 33)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext); + global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncRecord", "myBindAsyncParam", "MySimpleBindAsyncRecord.BindAsync(HttpContext)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 34, 5)] + internal static RouteHandlerBuilder MapGet9( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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.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 global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext); - global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncRecord", "myBindAsyncParam", "MySimpleBindAsyncRecord.BindAsync(HttpContext)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord)myBindAsyncParam_temp; - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 35, 5)] + internal static RouteHandlerBuilder MapGet10( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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", 34)] = ( - (methodInfo, options) => + async Task RequestHandler(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 34)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext); + global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncStruct", "myBindAsyncParam", "MySimpleBindAsyncStruct.BindAsync(HttpContext)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext); + global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncStruct", "myBindAsyncParam", "MySimpleBindAsyncStruct.BindAsync(HttpContext)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp; } - async Task RequestHandler(HttpContext httpContext) + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp; + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 36, 5)] + internal static RouteHandlerBuilder MapGet11( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?)myBindAsyncParam_temp; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?)myBindAsyncParam_temp; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord.BindAsync(httpContext); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncRecord?)myBindAsyncParam_temp; + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, 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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 37, 5)] + internal static RouteHandlerBuilder MapGet12( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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) { - 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); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromImplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromImplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface)myBindAsyncParam_temp; } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 35)] = ( - (methodInfo, options) => + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 35)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await BindAsync(httpContext, parameters[1]); + global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("BindAsyncFromImplicitStaticAbstractInterface", "myBindAsyncParam", "BindAsyncFromImplicitStaticAbstractInterface.BindAsync(HttpContext, ParameterInfo)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); + 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(@"TestMapActions.cs", 38, 5)] + internal static RouteHandlerBuilder MapGet13( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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.MySimpleBindAsyncStruct.BindAsync(httpContext); - global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncStruct", "myBindAsyncParam", "MySimpleBindAsyncStruct.BindAsync(HttpContext)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else + filteredInvocation = GeneratedRouteBuilderExtensionsCore.BuildFilterDelegate(ic => + { + if (ic.HttpContext.Response.StatusCode == 400) { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + options.EndpointBuilder, + handler.Method); + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - 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; + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await BindAsync(httpContext, parameters[0]); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface?)myBindAsyncParam_temp; - async Task RequestHandlerFiltered(HttpContext httpContext) + if (wasParamCheckFailure) { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext); - global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("MySimpleBindAsyncStruct", "myBindAsyncParam", "MySimpleBindAsyncStruct.BindAsync(HttpContext)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct)myBindAsyncParam_temp; - } + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - if (wasParamCheckFailure) + [InterceptsLocation(@"TestMapActions.cs", 39, 5)] + internal static RouteHandlerBuilder MapGet14( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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.StatusCode = 400; + return ValueTask.FromResult(Results.Empty); } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, httpContext_local, myBindAsyncParam_local)); - if (result is not null) + return ValueTask.FromResult(handler(ic.GetArgument(0)!, ic.GetArgument(1)!)); + }, + options.EndpointBuilder, + handler.Method); + } + + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext); + global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("InheritBindAsync", "myBindAsyncParam", "InheritBindAsync.BindAsync(HttpContext)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; + } + var result = handler(httpContext_local, myBindAsyncParam_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } + + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + var httpContext_local = httpContext; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext); + global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync myBindAsyncParam_local; + if ((object?)myBindAsyncParam_temp == null) + { + logOrThrowExceptionHelper.RequiredParameterNotProvided("InheritBindAsync", "myBindAsyncParam", "InheritBindAsync.BindAsync(HttpContext)"); + wasParamCheckFailure = true; + myBindAsyncParam_local = default!; + } + else + { + myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp; + } + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 40, 5)] + internal static RouteHandlerBuilder MapGet15( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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", 36)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 36)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandler(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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; + return; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = handler(myBindAsyncParam_local); + if (result is string) { - var wasParamCheckFailure = false; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct.BindAsync(httpContext); - var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.MySimpleBindAsyncStruct?)myBindAsyncParam_temp; - - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); - if (result is not null) - { - await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); - } + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; } + await httpContext.Response.WriteAsync(result); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 37)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 37)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromImplicitStaticAbstractInterface)myBindAsyncParam_temp; - } + var wasParamCheckFailure = false; + var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext); + var myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync?)myBindAsyncParam_temp; - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(httpContext_local, myBindAsyncParam_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; } - - async Task RequestHandlerFiltered(HttpContext httpContext) + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, myBindAsyncParam_local)); + if (result is not null) { - 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; - } + 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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 41, 5)] + internal static RouteHandlerBuilder MapGet16( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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) { - 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", 38)] = ( - (methodInfo, options) => + async Task RequestHandler(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 38)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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; + 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", 39)] = ( - (methodInfo, options) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 39)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 - { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp; - } + 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; + } - 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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + [InterceptsLocation(@"TestMapActions.cs", 42, 5)] + internal static RouteHandlerBuilder MapGet17( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.BindAsyncFromExplicitStaticAbstractInterface? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 => { - var wasParamCheckFailure = false; - var httpContext_local = httpContext; - var myBindAsyncParam_temp = await global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync.BindAsync(httpContext); - global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync myBindAsyncParam_local; - if ((object?)myBindAsyncParam_temp == null) - { - logOrThrowExceptionHelper.RequiredParameterNotProvided("InheritBindAsync", "myBindAsyncParam", "InheritBindAsync.BindAsync(HttpContext)"); - wasParamCheckFailure = true; - myBindAsyncParam_local = default!; - } - else + if (ic.HttpContext.Response.StatusCode == 400) { - myBindAsyncParam_local = (global::Microsoft.AspNetCore.Http.Generators.Tests.InheritBindAsync)myBindAsyncParam_temp; + return ValueTask.FromResult(Results.Empty); } + return ValueTask.FromResult(handler(ic.GetArgument(0)!)); + }, + 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 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); + } - RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; - var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; - return new RequestDelegateResult(targetDelegate, metadata); - }), - [(@"TestMapActions.cs", 40)] = ( - (methodInfo, options) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 40)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 43, 5)] + internal static RouteHandlerBuilder MapGet18( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 44, 5)] + internal static RouteHandlerBuilder MapGet19( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.MyBindAsyncFromInterfaceRecord? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 44)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 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 4cb3dffa4d92..fd61eeee1a0a 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func> handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - PostVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,192 +54,222 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: false, contentTypes: GeneratedMetadataConstants.JsonContentType)); - PopulateMetadataForEndpoint>(methodInfo, options.EndpointBuilder); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: false, contentTypes: GeneratedMetadataConstants.JsonContentType)); + PopulateMetadataForEndpoint>(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 MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapPost1( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), isOptional: true, contentTypes: GeneratedMetadataConstants.JsonContentType)); + PopulateMetadataForEndpoint>(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 AcceptsMetadata(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 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 371e3f08c6fa..93845dcdd017 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,127 +54,143 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 32184ed5d043..12fe0946ac5f 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,101 +54,117 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 e148f3e9ea3c..4df42e4719c8 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,101 +54,117 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 67b227307e39..8e296270f821 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,127 +54,143 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 4cfa0ea94260..82337f60ba87 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,100 +54,116 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 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 c1e411162873..5041273070d7 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,100 +54,116 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 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 d77e4adf4c5e..cbb472da7740 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,77 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func 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) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -93,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -115,268 +54,312 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TestService arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func, global::System.String>)del; - EndpointFilterDelegate? filteredInvocation = null; - var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var 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 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 MapGet1( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.Collections.Generic.IEnumerable 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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + Task RequestHandler(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func, global::System.String>)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) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create>(httpContext, svc_local)); + if (result is not null) { - var wasParamCheckFailure = false; - // Endpoint Parameter: svc (Type = Microsoft.AspNetCore.Http.Generators.Tests.TestService?, IsOptional = True, IsParsable = False, IsArray = False, Source = Service) - var svc_local = httpContext.RequestServices.GetService();; - // Endpoint Parameter: svcs (Type = System.Collections.Generic.IEnumerable, IsOptional = False, IsParsable = False, IsArray = False, Source = Service) - var svcs_local = httpContext.RequestServices.GetRequiredService>(); + 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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet2( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TestService? arg0, global::System.Collections.Generic.IEnumerable 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 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 81753182e793..9b7fa4ea78bb 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,504 +54,138 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + [InterceptsLocation(@"TestMapActions.cs", 26, 5)] + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] + [InterceptsLocation(@"TestMapActions.cs", 28, 5)] + [InterceptsLocation(@"TestMapActions.cs", 29, 5)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, queryValue_local)); - if (result is not null) + 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", 26)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 26)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + Task RequestHandler(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 28)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 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; @@ -637,12 +240,6 @@ namespace Microsoft.AspNetCore.Http.Generated private static bool ShouldUseWith(this JsonTypeInfo jsonTypeInfo, [NotNullWhen(false)] Type? runtimeType) => runtimeType is null || jsonTypeInfo.Type == runtimeType || jsonTypeInfo.HasKnownPolymorphism(); - private static Func 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 d8c7fea47e0b..53360e2ef996 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,128 +54,144 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::Microsoft.AspNetCore.Http.Generators.Tests.ParsableTodo[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 05a5334778e4..fc03c1a9cb13 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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); - } - - 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); - 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 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 05a5334778e4..fc03c1a9cb13 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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); - } - - 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); - 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 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 05a5334778e4..fc03c1a9cb13 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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); - } - - 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); - 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 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 ed7ccca59116..b8406100a245 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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); - } - - 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); - 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 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 f1e3523ad8e1..60dcd618cf7d 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - PostVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,145 +54,161 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.Todo arg0, global::Microsoft.AspNetCore.Http.Generators.Tests.TestService arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 bc71989355b0..0d915f6aa202 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,103 +54,119 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0, global::Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 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 9e3810c7ec35..b5970e3ee26d 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,136 +54,152 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String arg0, global::System.String arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 ca5e78a98ecd..30b1cdcb8e67 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,97 +54,113 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 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 ca5e78a98ecd..30b1cdcb8e67 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,97 +54,113 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 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 8a5748964c35..407cc1143ec5 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,90 +54,106 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::Microsoft.AspNetCore.Http.Generators.Tests.Todo () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 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 c7dde2a4112e..89ffac6dd26b 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,48 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,89 +54,105 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - PopulateMetadataForEndpoint(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 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 e26ec884311e..279f543e3aa2 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Action handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) - { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,89 +54,105 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, void () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 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 7adb62b72bf1..425bdeda4911 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,134 +54,150 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TryParseTodo arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 354cd0cc14e4..2f87e61ade45 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,134 +54,150 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.TodoStatus arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 89d8737ff940..be604266f1a6 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - GetVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,108 +54,124 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String? arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 1e391d5f1836..645b90e7dae0 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Action handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - PostVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,124 +54,140 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - var parameterInfos = methodInfo.GetParameters(); - var x_ParameterInfo = parameterInfos[0]; - PopulateMetadataForParameter(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 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 2d1b002187ea..db09debdf2eb 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,47 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapMethods( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Collections.Generic.IEnumerable 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -62,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -84,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapMethods0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable httpMethods, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 2d1b002187ea..db09debdf2eb 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,47 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapMethods( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Collections.Generic.IEnumerable 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -62,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -84,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapMethods0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable httpMethods, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 2d1b002187ea..db09debdf2eb 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,47 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapMethods( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Collections.Generic.IEnumerable 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -62,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -84,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapMethods0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable httpMethods, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 2d1b002187ea..db09debdf2eb 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,47 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapMethods( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Collections.Generic.IEnumerable 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); - } - - } } namespace Microsoft.AspNetCore.Http.Generated @@ -62,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -84,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { - - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapMethods0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + IEnumerable httpMethods, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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 ec297da17abb..1ea5f6afea3b 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - PostVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,147 +54,163 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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); - } - - async Task RequestHandler(HttpContext httpContext) - { - var wasParamCheckFailure = false; - // Endpoint Parameter: p (Type = string[], IsOptional = False, IsParsable = False, IsArray = True, Source = JsonBodyOrQuery) - global::System.String[] p_local = null!; - if (options.DisableInferBodyFromParameters) - { - var p_raw = httpContext.Request.Query["p"]; - p_local = p_raw!; - } - else + if (ic.HttpContext.Response.StatusCode == 400) { - var p_JsonTypeInfo = (JsonTypeInfo)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 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 0b6a361f1f36..702009383e1d 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,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - PostVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,140 +54,156 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapPost0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var serviceProviderIsService = serviceProvider.GetRequiredService(); + 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 AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); - break; - } + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(type: type, isOptional: isOptional, contentTypes: GeneratedMetadataConstants.JsonContentType)); + break; } - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + } + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, type: typeof(global::System.Int32), contentTypes: GeneratedMetadataConstants.JsonContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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); - } - - 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); - 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 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 68ee67e9bfd5..8e79a6dd535a 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,78 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func 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 @@ -93,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -115,318 +54,290 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + [InterceptsLocation(@"TestMapActions.cs", 26, 5)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String () => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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); } + } + + 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); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet1( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Threading.Tasks.Task () => 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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandler(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func>)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) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 28)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func>)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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 28, 5)] + internal static RouteHandlerBuilder MapGet2( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.Threading.Tasks.ValueTask () => 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 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 2b469d15b319..acb193c5e852 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,77 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Func 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); } - } } @@ -93,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -115,257 +54,301 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 25)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 25)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + async Task RequestHandlerFiltered(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 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 MapGet1( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpResponse arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + Task RequestHandler(HttpContext httpContext) { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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) + { + httpContext.Response.StatusCode = 400; + } + var result = await filteredInvocation(EndpointFilterInvocationContext.Create(httpContext, res_local)); + if (result is not null) { - var wasParamCheckFailure = false; - var req_local = httpContext.Request; - var res_local = httpContext.Response; + await GeneratedRouteBuilderExtensionsCore.ExecuteReturnAsync(result, httpContext, objectJsonTypeInfo); + } + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return Task.CompletedTask; - } - var result = handler(req_local, res_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else + RequestDelegate targetDelegate = filteredInvocation is null ? RequestHandler : RequestHandlerFiltered; + var metadata = inferredMetadataResult?.EndpointMetadata ?? ReadOnlyCollection.Empty; + return new RequestDelegateResult(targetDelegate, metadata); + }; + return MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 27, 5)] + internal static RouteHandlerBuilder MapGet2( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0, global::Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var jsonOptions = serviceProvider?.GetService>()?.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 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 17945402424e..e3f0b1c63e0a 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt @@ -8,47 +8,15 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) - { - Path = path; - Line = line; - } - } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapPost( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Action handler, - [global::System.Runtime.CompilerServices.CallerFilePath] string filePath = "", - [global::System.Runtime.CompilerServices.CallerLineNumber]int lineNumber = 0) + public InterceptsLocationAttribute(string filePath, int line, int column) { - return global::Microsoft.AspNetCore.Http.Generated.GeneratedRouteBuilderExtensionsCore.MapCore( - endpoints, - pattern, - handler, - PostVerb, - filePath, - lineNumber); } - } } @@ -63,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -85,192 +54,208 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 29, 5)] + internal static RouteHandlerBuilder MapPost0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 29)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 29)); - options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.FormFileContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.FormFileContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.HttpContext arg0, global::Microsoft.AspNetCore.Http.IFormFile arg1, global::Microsoft.AspNetCore.Http.IFormFileCollection arg2, global::Microsoft.AspNetCore.Http.IFormCollection arg3, global::Microsoft.AspNetCore.Http.Generators.Tests.MyTryParseRecord arg4) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 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/SupportsDifferentInterceptorsFromSameLocation.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt new file mode 100644 index 000000000000..601db01a187c --- /dev/null +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt @@ -0,0 +1,529 @@ +//------------------------------------------------------------------------------ +// +// 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[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 new file mode 100644 index 000000000000..9a3a6eafe252 --- /dev/null +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt @@ -0,0 +1,404 @@ +//------------------------------------------------------------------------------ +// +// 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[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; + + [InterceptsLocation(@"TestMapActions.cs", 25, 13)] + [InterceptsLocation(@"TestMapActions.cs", 25, 63)] + [InterceptsLocation(@"OtherTestMapActions.cs", 25, 13)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::System.String arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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); + } + + + + 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 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 87263e7db66a..a2459ee37802 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt @@ -8,109 +8,16 @@ //------------------------------------------------------------------------------ #nullable enable -namespace Microsoft.AspNetCore.Builder +namespace System.Runtime.CompilerServices { %GENERATEDCODEATTRIBUTE% - internal sealed class SourceKey + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + file sealed class InterceptsLocationAttribute : Attribute { - public string Path { get; init; } - public int Line { get; init; } - - public SourceKey(string path, int line) + public InterceptsLocationAttribute(string filePath, int line, int column) { - Path = path; - Line = line; } } - - // This class needs to be internal so that the compiled application - // has access to the strongly-typed endpoint definitions that are - // generated by the compiler so that they will be favored by - // overload resolution and opt the runtime in to the code generated - // implementation produced here. - %GENERATEDCODEATTRIBUTE% - internal static class GenerateRouteBuilderEndpoints - { - private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; - private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - - internal static global::Microsoft.AspNetCore.Builder.RouteHandlerBuilder MapGet( - this global::Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, - [global::System.Diagnostics.CodeAnalysis.StringSyntax("Route")] string pattern, - global::System.Action 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 @@ -124,6 +31,7 @@ namespace Microsoft.AspNetCore.Http.Generated using System.Globalization; using System.Linq; using System.Reflection; + using System.Runtime.CompilerServices; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; @@ -146,532 +54,605 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; +private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; - private static readonly Dictionary<(string, int), (MetadataPopulator, RequestDelegateFactoryFunc)> map = new() + [InterceptsLocation(@"TestMapActions.cs", 44, 5)] + internal static RouteHandlerBuilder MapGet0( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) { - [(@"TestMapActions.cs", 44)] = ( - (methodInfo, options) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - options.EndpointBuilder.Metadata.Add(new SourceKey(@"TestMapActions.cs", 44)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListWitDefaultValue arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 45, 5)] + internal static RouteHandlerBuilder MapGet1( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParameterListRecordStruct arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 46, 5)] + internal static RouteHandlerBuilder MapGet2( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, void (global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithHttpContext arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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 AcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType)); - options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); - return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; - }, - (del, options, inferredMetadataResult) => - { - Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); - Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); - Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); - Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); - var handler = (System.Func)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 MapCore( + endpoints, + pattern, + handler, + GetVerb, + populateMetadata, + createRequestDelegate); + } - async Task RequestHandler(HttpContext httpContext) + [InterceptsLocation(@"TestMapActions.cs", 47, 5)] + internal static RouteHandlerBuilder MapPost3( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType)); + options.EndpointBuilder.Metadata.Add(new ProducesResponseTypeMetadata(statusCode: StatusCodes.Status200OK, contentTypes: GeneratedMetadataConstants.PlaintextContentType)); + return new RequestDelegateMetadataResult { EndpointMetadata = options.EndpointBuilder.Metadata.AsReadOnly() }; + }; + RequestDelegateFactoryFunc createRequestDelegate = (del, options, inferredMetadataResult) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + Debug.Assert(options.EndpointBuilder.ApplicationServices != null, "ApplicationServices not found."); + Debug.Assert(options.EndpointBuilder.FilterFactories != null, "FilterFactories not found."); + var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody arg0) => throw null!); + EndpointFilterDelegate? filteredInvocation = null; + var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; + var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); + var jsonOptions = serviceProvider?.GetService>()?.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); + } - var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody(HttpContext_local, Todo_local); + async Task RequestHandler(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters) + var HttpContext_local = httpContext; + // Endpoint Parameter: Todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService) + var Todo_resolveJsonBodyOrServiceResult = await Todo_JsonBodyOrServiceResolver(httpContext, false); + var Todo_local = Todo_resolveJsonBodyOrServiceResult.Item2; + if (!Todo_resolveJsonBodyOrServiceResult.Item1) + { + return; + } - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - return; - } - var result = handler(args_local); - if (result is string) - { - httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; - } - else - { - httpContext.Response.ContentType ??= "application/json; charset=utf-8"; - } - await httpContext.Response.WriteAsync(result); + var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody(HttpContext_local, Todo_local); + + if (wasParamCheckFailure) + { + httpContext.Response.StatusCode = 400; + return; } + var result = handler(args_local); + if (result is string) + { + httpContext.Response.ContentType ??= "text/plain; charset=utf-8"; + } + else + { + httpContext.Response.ContentType ??= "application/json; charset=utf-8"; + } + await httpContext.Response.WriteAsync(result); + } - async Task RequestHandlerFiltered(HttpContext httpContext) + async Task RequestHandlerFiltered(HttpContext httpContext) + { + var wasParamCheckFailure = false; + // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters) + var HttpContext_local = httpContext; + // Endpoint Parameter: Todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService) + var Todo_resolveJsonBodyOrServiceResult = await Todo_JsonBodyOrServiceResolver(httpContext, false); + var Todo_local = Todo_resolveJsonBodyOrServiceResult.Item2; + if (!Todo_resolveJsonBodyOrServiceResult.Item1) { - var wasParamCheckFailure = false; - // Endpoint Parameter: args (Type = Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody, IsOptional = False, IsParsable = False, IsArray = False, Source = AsParameters) - var HttpContext_local = httpContext; - // Endpoint Parameter: Todo (Type = Microsoft.AspNetCore.Http.Generators.Tests.TodoStruct, IsOptional = False, IsParsable = False, IsArray = False, Source = JsonBodyOrService) - var Todo_resolveJsonBodyOrServiceResult = await Todo_JsonBodyOrServiceResolver(httpContext, false); - var Todo_local = Todo_resolveJsonBodyOrServiceResult.Item2; - if (!Todo_resolveJsonBodyOrServiceResult.Item1) - { - return; - } + return; + } - var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody(HttpContext_local, Todo_local); + var args_local = new global::Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithImplicitFromBody(HttpContext_local, Todo_local); - if (wasParamCheckFailure) - { - httpContext.Response.StatusCode = 400; - } - var result = await filteredInvocation(EndpointFilterInvocationContext.Create(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 AcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType)); - var parameterInfos = methodInfo.GetParameters(); - var Value_ParameterInfo = new PropertyAsParameterInfo(false, typeof(Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType)!.GetProperty("Value")!, typeof(Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType).GetConstructor(new[] { typeof(Microsoft.AspNetCore.Http.HttpContext), typeof(Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty) })?.GetParameters()[1]); - PopulateMetadataForParameter(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 MapCore( + endpoints, + pattern, + handler, + PostVerb, + populateMetadata, + createRequestDelegate); + } + + [InterceptsLocation(@"TestMapActions.cs", 48, 5)] + internal static RouteHandlerBuilder MapGet4( + this IEndpointRouteBuilder endpoints, + [StringSyntax("Route")] string pattern, + Delegate handler) + { + MetadataPopulator populateMetadata = (methodInfo, options) => + { + Debug.Assert(options != null, "RequestDelegateFactoryOptions not found."); + Debug.Assert(options.EndpointBuilder != null, "EndpointBuilder not found."); + options.EndpointBuilder.Metadata.Add(new System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.AspNetCore.Http.RequestDelegateGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")); + options.EndpointBuilder.Metadata.Add(new AcceptsMetadata(contentTypes: GeneratedMetadataConstants.JsonContentType)); + var parameterInfos = methodInfo.GetParameters(); + var Value_ParameterInfo = new PropertyAsParameterInfo(false, typeof(Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType)!.GetProperty("Value")!, typeof(Microsoft.AspNetCore.Http.Generators.Tests.ParametersListWithMetadataType).GetConstructor(new[] { typeof(Microsoft.AspNetCore.Http.HttpContext), typeof(Microsoft.AspNetCore.Http.Generators.Tests.AddsCustomParameterMetadataAsProperty) })?.GetParameters()[1]); + PopulateMetadataForParameter(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 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..f17e16777d64 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,91 @@ 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}!");app.MapGet("/bye", (string name) => "Bye {name}!");"""); + var otherSource = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");""", "OtherTestMapActions"); + project = project.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8)).Project; + project = project.AddDocument("OtherTestMapActions.cs", SourceText.From(otherSource, Encoding.UTF8)).Project; + var compilation = await project.GetCompilationAsync(); + + var generator = new RequestDelegateGenerator.RequestDelegateGenerator().AsSourceGenerator(); + GeneratorDriver driver = CSharpGeneratorDriver.Create(generators: new[] + { + generator + }, + driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true), + parseOptions: ParseOptions); + driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation, + out var _); + + var diagnostics = updatedCompilation.GetDiagnostics(); + Assert.Empty(diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Warning)); + + await VerifyAgainstBaselineUsingFile(updatedCompilation); + } + + [Fact] + public async Task SupportsDifferentInterceptorsFromSameLocation() + { + var project = CreateProject(); + var source = GetMapActionString("""app.MapGet("/", (string name) => "Hello {name}!");"""); + var otherSource = GetMapActionString("""app.MapGet("/", (int age) => "Hello {age}!");""", "OtherTestMapActions"); + project = project.AddDocument("TestMapActions.cs", SourceText.From(source, Encoding.UTF8)).Project; + project = project.AddDocument("OtherTestMapActions.cs", SourceText.From(otherSource, Encoding.UTF8)).Project; + var compilation = await project.GetCompilationAsync(); + + var generator = new RequestDelegateGenerator.RequestDelegateGenerator().AsSourceGenerator(); + GeneratorDriver driver = CSharpGeneratorDriver.Create(generators: new[] + { + generator + }, + driverOptions: new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, trackIncrementalGeneratorSteps: true), + parseOptions: ParseOptions); + driver = driver.RunGeneratorsAndUpdateCompilation(compilation, out var updatedCompilation, + out var _); + + var diagnostics = updatedCompilation.GetDiagnostics(); + Assert.Empty(diagnostics.Where(d => d.Severity >= DiagnosticSeverity.Warning)); + + await VerifyAgainstBaselineUsingFile(updatedCompilation); + } + + [Fact] + public async Task SourceMapsAllPathsInAttribute() + { + var currentDirectory = Directory.GetCurrentDirectory(); + var mappedDirectory = Path.Combine(currentDirectory, "path", "mapped"); + var project = CreateProject(modifyCompilationOptions: + (options) => + { + return options.WithSourceReferenceResolver( + new SourceFileResolver(ImmutableArray.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..99bfac5bea50 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, @@ -106,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(); @@ -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,15 +169,18 @@ internal Endpoint[] GetEndpointsFromCompilation(Compilation compilation, bool? e foreach (var endpoint in endpoints) { - var sourceKeyMetadata = endpoint.Metadata.FirstOrDefault(metadata => metadata.GetType() == sourceKeyType); + var generatedCodeAttribute = endpoint.Metadata.OfType().SingleOrDefault(); - if (expectSourceKey) + if (expectGeneratedCode) { - Assert.NotNull(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); } } @@ -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..ff0e1772f56b --- /dev/null +++ b/src/Shared/RoslynUtils/IncrementalValuesProviderExtensions.cs @@ -0,0 +1,39 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using Microsoft.CodeAnalysis; + +internal static class IncrementalValuesProviderExtensions +{ + public static IncrementalValuesProvider<(TSource Source, int Index, ImmutableArray 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, int Index, ImmutableArray Elements)>.Builder result = + ImmutableArray.CreateBuilder<(TSource, int, ImmutableArray)>(); + var index = 0; + foreach (var entry in map) + { + result.Add((entry.Key, index, entry.Value.ToImmutable())); + index++; + } + 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; }