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