Skip to content

Commit 69dae0a

Browse files
committed
Update requiredness checks for BindAsync params
1 parent 8c658cc commit 69dae0a

File tree

7 files changed

+15
-8
lines changed

7 files changed

+15
-8
lines changed

src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EmitterExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static bool IsSerializableJsonResponse(this EndpointResponse endpointResp
4242
// the underlying value for a nullable value type instead of using the non-nullable reference type modifier.
4343
EndpointParameterSource.BindAsync => endpointParameter.IsOptional ?
4444
endpointParameter.EmitHandlerArgument() :
45-
endpointParameter.Type.IsValueType && endpointParameter.GetBindAsyncReturnType()?.OriginalDefinition.SpecialType == SpecialType.System_Nullable_T
45+
endpointParameter.Type.IsValueType && endpointParameter.GetBindAsyncReturnType().IsNullableOfT()
4646
? $"{endpointParameter.EmitHandlerArgument()}.HasValue ? {endpointParameter.EmitHandlerArgument()}.Value : default"
4747
: $"{endpointParameter.EmitHandlerArgument()}",
4848
EndpointParameterSource.Unknown => throw new NotImplementedException("Unreachable!"),

src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointParameterEmitter.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,9 @@ internal static void EmitBindAsyncPreparation(this EndpointParameter endpointPar
294294

295295
if (!endpointParameter.IsOptional)
296296
{
297-
codeWriter.WriteLine($"if ({endpointParameter.EmitHandlerArgument()} == null)");
297+
codeWriter.WriteLine(endpointParameter.Type.IsValueType && endpointParameter.GetBindAsyncReturnType().IsNullableOfT()
298+
? $"if (!{endpointParameter.EmitHandlerArgument()}.HasValue)"
299+
: $"if ({endpointParameter.EmitHandlerArgument()} == null)");
298300
codeWriter.StartBlock();
299301
codeWriter.WriteLine($@"logOrThrowExceptionHelper.RequiredParameterNotProvided({SymbolDisplay.FormatLiteral(endpointParameter.Type.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat), true)}, {SymbolDisplay.FormatLiteral(endpointParameter.SymbolName, true)}, {SymbolDisplay.FormatLiteral(endpointParameter.ToMessageString(), true)});");
300302
codeWriter.WriteLine("wasParamCheckFailure = true;");

src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Model/EndpointParameterExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,7 @@ public static ITypeSymbol UnwrapParameterType(this EndpointParameter parameter)
4141

4242
public static ITypeSymbol? GetBindAsyncReturnType(this EndpointParameter parameter)
4343
=> ((INamedTypeSymbol?)parameter.BindableMethodSymbol?.ReturnType)?.TypeArguments[0];
44+
45+
public static bool IsNullableOfT(this ITypeSymbol? typeSymbol)
46+
=> typeSymbol?.OriginalDefinition.SpecialType == SpecialType.System_Nullable_T;
4447
}

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_NullableReturn.generated.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ namespace Microsoft.AspNetCore.Http.Generated
209209
{
210210
var wasParamCheckFailure = false;
211211
var param_local = await global::Microsoft.AspNetCore.Http.Generators.Tests.BindableStructWithNullReturn.BindAsync(httpContext, parameters[0]);
212-
if (param_local == null)
212+
if (!param_local.HasValue)
213213
{
214214
logOrThrowExceptionHelper.RequiredParameterNotProvided("BindableStructWithNullReturn", "param", "BindableStructWithNullReturn.BindAsync(HttpContext, ParameterInfo)");
215215
wasParamCheckFailure = true;
@@ -237,7 +237,7 @@ namespace Microsoft.AspNetCore.Http.Generated
237237
{
238238
var wasParamCheckFailure = false;
239239
var param_local = await global::Microsoft.AspNetCore.Http.Generators.Tests.BindableStructWithNullReturn.BindAsync(httpContext, parameters[0]);
240-
if (param_local == null)
240+
if (!param_local.HasValue)
241241
{
242242
logOrThrowExceptionHelper.RequiredParameterNotProvided("BindableStructWithNullReturn", "param", "BindableStructWithNullReturn.BindAsync(HttpContext, ParameterInfo)");
243243
wasParamCheckFailure = true;

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ namespace Microsoft.AspNetCore.Http.Generated
504504
var wasParamCheckFailure = false;
505505
var httpContext_local = httpContext;
506506
var myBindAsyncParam_local = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]);
507-
if (myBindAsyncParam_local == null)
507+
if (!myBindAsyncParam_local.HasValue)
508508
{
509509
logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
510510
wasParamCheckFailure = true;
@@ -533,7 +533,7 @@ namespace Microsoft.AspNetCore.Http.Generated
533533
var wasParamCheckFailure = false;
534534
var httpContext_local = httpContext;
535535
var myBindAsyncParam_local = await global::Microsoft.AspNetCore.Http.Generators.Tests.MyNullableBindAsyncStruct.BindAsync(httpContext, parameters[1]);
536-
if (myBindAsyncParam_local == null)
536+
if (!myBindAsyncParam_local.HasValue)
537537
{
538538
logOrThrowExceptionHelper.RequiredParameterNotProvided("MyNullableBindAsyncStruct", "myBindAsyncParam", "MyNullableBindAsyncStruct.BindAsync(HttpContext, ParameterInfo)");
539539
wasParamCheckFailure = true;

src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.AspNetCore.Http.RequestDelegateGenerator;
77
using Microsoft.CodeAnalysis.CSharp;
88
using Microsoft.CodeAnalysis.Text;
9+
using Microsoft.Extensions.Logging;
910

1011
namespace Microsoft.AspNetCore.Http.Generators.Tests;
1112

@@ -330,6 +331,7 @@ public async Task MapAction_BindAsync_NullableReturn()
330331
Assert.Equal(400, httpContext.Response.StatusCode);
331332
}
332333

334+
Assert.All(TestSink.Writes, context => Assert.Equal("RequiredParameterNotProvided", context.EventId.Name));
333335
await VerifyAgainstBaselineUsingFile(compilation);
334336
}
335337
}

src/Http/Http.Extensions/test/RequestDelegateGenerator/SharedTypes.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ public static bool TryParse(string? input, IFormatProvider? provider, out Parsab
193193
}
194194
else
195195
{
196-
result = null!;
197-
return false;
196+
result = null!;
197+
return false;
198198
}
199199
}
200200
}

0 commit comments

Comments
 (0)