Skip to content

Commit 5d10dce

Browse files
authored
Update TryParse code gen to use CodeWriter. (#46928)
* Update TryParse code gen to use CodeWriter.
1 parent f7628d4 commit 5d10dce

File tree

5 files changed

+32
-32
lines changed

5 files changed

+32
-32
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ internal static void EmitParsingBlock(this EndpointParameter endpointParameter,
4444
{
4545
if (endpointParameter.IsParsable)
4646
{
47-
var parsingBlock = endpointParameter.ParsingBlockEmitter(endpointParameter.EmitTempArgument(), endpointParameter.EmitParsedTempArgument());
48-
codeWriter.WriteLine(parsingBlock);
47+
endpointParameter.ParsingBlockEmitter(codeWriter, endpointParameter.EmitTempArgument(), endpointParameter.EmitParsedTempArgument());
4948
codeWriter.WriteLine($"{endpointParameter.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)} {endpointParameter.EmitHandlerArgument()} = {endpointParameter.EmitParsedTempArgument()}!;");
5049
}
5150
else

src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public EndpointParameter(IParameterSymbol parameter, WellKnownTypes wellKnownTyp
7676
}
7777
}
7878

79-
private bool TryGetParsability(IParameterSymbol parameter, WellKnownTypes wellKnownTypes, [NotNullWhen(true)]out Func<string, string, string>? parsingBlockEmitter)
79+
private bool TryGetParsability(IParameterSymbol parameter, WellKnownTypes wellKnownTypes, [NotNullWhen(true)]out Action<CodeWriter, string, string>? parsingBlockEmitter)
8080
{
8181
var parameterType = parameter.Type.UnwrapTypeSymbol();
8282

@@ -132,35 +132,36 @@ private bool TryGetParsability(IParameterSymbol parameter, WellKnownTypes wellKn
132132

133133
if (IsOptional)
134134
{
135-
parsingBlockEmitter = (inputArgument, outputArgument) => $$"""
136-
{{parameter.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}} {{outputArgument}} = default;
137-
if ({{preferredTryParseInvocation(inputArgument, $"{inputArgument}_parsed_non_nullable")}})
138-
{
139-
{{outputArgument}} = {{$"{inputArgument}_parsed_non_nullable"}};
140-
}
141-
else if (string.IsNullOrEmpty({{inputArgument}}))
142-
{
143-
{{outputArgument}} = null;
144-
}
145-
else
146-
{
147-
wasParamCheckFailure = true;
148-
}
149-
""";
135+
parsingBlockEmitter = (writer, inputArgument, outputArgument) =>
136+
{
137+
writer.WriteLine($"""{parameter.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)} {outputArgument} = default;""");
138+
writer.WriteLine($$"""if ({{preferredTryParseInvocation(inputArgument, $"{inputArgument}_parsed_non_nullable")}})""");
139+
writer.StartBlock();
140+
writer.WriteLine($$"""{{outputArgument}} = {{$"{inputArgument}_parsed_non_nullable"}};""");
141+
writer.EndBlock();
142+
writer.WriteLine($$"""else if (string.IsNullOrEmpty({{inputArgument}}))""");
143+
writer.StartBlock();
144+
writer.WriteLine($$"""{{outputArgument}} = null;""");
145+
writer.EndBlock();
146+
writer.WriteLine("else");
147+
writer.StartBlock();
148+
writer.WriteLine("wasParamCheckFailure = true;");
149+
writer.EndBlock();
150+
};
150151
}
151152
else
152153
{
153-
parsingBlockEmitter = (inputArgument, outputArgument) => $$"""
154-
if (!{{preferredTryParseInvocation(inputArgument, outputArgument)}})
155-
{
156-
wasParamCheckFailure = true;
157-
}
158-
""";
154+
parsingBlockEmitter = (writer, inputArgument, outputArgument) =>
155+
{
156+
writer.WriteLine($$"""if (!{{preferredTryParseInvocation(inputArgument, outputArgument)}})""");
157+
writer.StartBlock();
158+
writer.WriteLine("wasParamCheckFailure = true;");
159+
writer.EndBlock();
160+
};
159161
}
160162

161163
// Wrap the TryParse method call in an if-block and if it doesn't work set param check failure.
162164
return true;
163-
164165
}
165166

166167
public ITypeSymbol Type { get; }
@@ -173,7 +174,7 @@ private bool TryGetParsability(IParameterSymbol parameter, WellKnownTypes wellKn
173174
public bool IsOptional { get; }
174175
[MemberNotNull("ParsingBlockEmitter")]
175176
public bool IsParsable { get; }
176-
public Func<string, string, string> ParsingBlockEmitter { get; }
177+
public Action<CodeWriter, string, string> ParsingBlockEmitter { get; }
177178

178179
// TODO: Handle special form types like IFormFileCollection that need special body-reading logic.
179180
private static bool TryGetSpecialTypeAssigningCode(ITypeSymbol type, WellKnownTypes wellKnownTypes, [NotNullWhen(true)] out string? callingCode)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Http.Generated
121121
wasParamCheckFailure = true;
122122
}
123123
var p_temp = p_raw.ToString();
124-
if (!global::Todo.TryParse(p_temp!, out var p_parsed_temp))
124+
if (!global::Todo.TryParse(p_temp!, out var p_parsed_temp))
125125
{
126126
wasParamCheckFailure = true;
127127
}
@@ -147,7 +147,7 @@ namespace Microsoft.AspNetCore.Http.Generated
147147
wasParamCheckFailure = true;
148148
}
149149
var p_temp = p_raw.ToString();
150-
if (!global::Todo.TryParse(p_temp!, out var p_parsed_temp))
150+
if (!global::Todo.TryParse(p_temp!, out var p_parsed_temp))
151151
{
152152
wasParamCheckFailure = true;
153153
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Http.Generated
121121
wasParamCheckFailure = true;
122122
}
123123
var p_temp = p_raw.ToString();
124-
if (!Enum.TryParse<global::TodoStatus>(p_temp!, out var p_parsed_temp))
124+
if (!Enum.TryParse<global::TodoStatus>(p_temp!, out var p_parsed_temp))
125125
{
126126
wasParamCheckFailure = true;
127127
}
@@ -147,7 +147,7 @@ namespace Microsoft.AspNetCore.Http.Generated
147147
wasParamCheckFailure = true;
148148
}
149149
var p_temp = p_raw.ToString();
150-
if (!Enum.TryParse<global::TodoStatus>(p_temp!, out var p_parsed_temp))
150+
if (!Enum.TryParse<global::TodoStatus>(p_temp!, out var p_parsed_temp))
151151
{
152152
wasParamCheckFailure = true;
153153
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Http.Generated
121121
wasParamCheckFailure = true;
122122
}
123123
var p_temp = p_raw.ToString();
124-
if (!global::System.TimeOnly.TryParse(p_temp!, CultureInfo.InvariantCulture, out var p_parsed_temp))
124+
if (!global::System.TimeOnly.TryParse(p_temp!, CultureInfo.InvariantCulture, out var p_parsed_temp))
125125
{
126126
wasParamCheckFailure = true;
127127
}
@@ -147,7 +147,7 @@ namespace Microsoft.AspNetCore.Http.Generated
147147
wasParamCheckFailure = true;
148148
}
149149
var p_temp = p_raw.ToString();
150-
if (!global::System.TimeOnly.TryParse(p_temp!, CultureInfo.InvariantCulture, out var p_parsed_temp))
150+
if (!global::System.TimeOnly.TryParse(p_temp!, CultureInfo.InvariantCulture, out var p_parsed_temp))
151151
{
152152
wasParamCheckFailure = true;
153153
}

0 commit comments

Comments
 (0)