From 6fa6ca406c66ef20ae910566d0fdc87e4edc7d06 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 18:02:41 +0000 Subject: [PATCH 01/21] Initial plan From 79a59cba16ff3680e19eda75a4900627c6985d8a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 18:24:03 +0000 Subject: [PATCH 02/21] fix(http-client-csharp): deserialize primitive responses without reflection Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 39 +++++++++-- .../ClientProviders/ClientProviderTests.cs | 28 ++------ ...ity_BothMethodsParamOrderChanged(Async).cs | 7 ++ ...lity_BothMethodsParamOrderChanged(Sync).cs | 7 ++ ...nvenienceMethodParamOrderChanged(Async).cs | 7 ++ ...onvenienceMethodParamOrderChanged(Sync).cs | 7 ++ ...ltipleNewOptionalNonBodyParametersAdded.cs | 9 ++- ...dyParameterDoesNotAddBackCompatOverload.cs | 9 ++- ...bility_NewOptionalNonBodyParameterAdded.cs | 9 ++- ...ionalNonBodyParameterAddedWithModelBody.cs | 10 ++- ...rameterAddedWithPathAndHeaderParameters.cs | 10 ++- ...ty_NewOptionalParameterWithReservedName.cs | 9 ++- ...edParameterDoesNotAddBackCompatOverload.cs | 9 ++- .../ScmMethodProviderCollectionTests.cs | 68 +++++++++++++++++-- ...numReturnTypeMethods(False,False,False).cs | 4 ++ ...EnumReturnTypeMethods(False,False,True).cs | 4 ++ ...EnumReturnTypeMethods(False,True,False).cs | 4 ++ ...EnumReturnTypeMethods(True,False,False).cs | 4 ++ .../EnumReturnTypeMethods(True,True,False).cs | 4 ++ .../EnumReturnTypeMethods(True,True,True).cs | 4 ++ .../PlainTextReturnTypeMethods.cs | 2 + .../ScalarReturnTypeMethods(Boolean).cs | 4 +- ...calarReturnTypeMethods(BooleanNullable).cs | 4 ++ ...ScalarReturnTypeMethods(DateTimeOffset).cs | 4 +- .../ScalarReturnTypeMethods(Decimal).cs | 4 ++ .../ScalarReturnTypeMethods(Double).cs | 4 +- .../ScalarReturnTypeMethods(Int32).cs | 4 +- .../ScalarReturnTypeMethods(Int32Async).cs | 4 ++ .../ScalarReturnTypeMethods(Int32Nullable).cs | 4 ++ ...arReturnTypeMethods(Int32NullableAsync).cs | 4 ++ .../ScalarReturnTypeMethods(Int64).cs | 4 +- .../ScalarReturnTypeMethods(Single).cs | 4 +- .../ScalarReturnTypeMethods(String).cs | 4 +- .../ScalarReturnTypeMethods(TimeSpan).cs | 4 +- ...alarReturnTypeMethods(TimeSpanNullable).cs | 4 ++ .../src/Generated/SampleTypeSpecClient.cs | 9 ++- 36 files changed, 259 insertions(+), 60 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextReturnTypeMethods.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index fb0bb6e6025..34790e14f2c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -634,6 +634,21 @@ private IEnumerable GetStackVariablesForReturnValueConversi out declarations); } + if (IsConvertibleFromBinaryData(responseBodyType) + && (responseBodyType.IsFrameworkType || responseBodyType.IsEnum) + && !responseBodyType.Equals(typeof(BinaryData)) + && !IsPlainTextResponse(responseBodyType)) + { + var statements = new MethodBodyStatement[] + { + Declare("data", result.GetRawResponse().Content(), out var data), + UsingDeclare("document", data.Parse(), out var document) + }; + declarations["data"] = data; + declarations["document"] = document; + return statements; + } + return []; } @@ -855,21 +870,31 @@ private ValueExpression GetResultConversion(ClientResponseApi result, HttpRespon { return declarations["value"].CastTo(new CSharpType(responseBodyType.OutputType.FrameworkType, responseBodyType.Arguments[0], responseBodyType.Arguments[1])); } - if (responseBodyType.Equals(typeof(string)) && ServiceMethod.Operation.Responses.Any(r => r.IsErrorResponse is false && r.ContentTypes.Contains("text/plain"))) + if (IsPlainTextResponse(responseBodyType)) { return response.Content().InvokeToString(); } - if (responseBodyType.IsFrameworkType) - { - return response.Content().ToObjectFromJson(responseBodyType); - } - if (responseBodyType.IsEnum) + if (responseBodyType.IsFrameworkType || responseBodyType.IsEnum) { - return responseBodyType.ToEnum(response.Content().ToObjectFromJson(responseBodyType.UnderlyingEnumType)); + var element = declarations["document"].As().RootElement(); + var value = ScmCodeModelGenerator.Instance.TypeFactory.DeserializeJsonValue( + responseBodyType.WithNullable(false), + element, + declarations["data"].As(), + ScmCodeModelGenerator.Instance.ModelSerializationExtensionsDefinition.WireOptionsField.As(), + responseBodyType.Equals(typeof(TimeSpan)) || responseBodyType.Equals(typeof(TimeSpan?)) + ? SerializationFormat.Duration_Constant + : SerializationFormat.Default); + return responseBodyType.IsNullable + ? new TernaryConditionalExpression(element.ValueKindEqualsNull(), Null.CastTo(responseBodyType), value) + : value; } return result.CastTo(responseBodyType); } + private bool IsPlainTextResponse(CSharpType responseBodyType) + => responseBodyType.Equals(typeof(string)) && ServiceMethod.Operation.Responses.Any(r => r.IsErrorResponse is false && r.ContentTypes.Contains("text/plain")); + private static bool ShouldBuildStackVarForFrameworkType(CSharpType type) { if (!type.IsFrameworkType) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs index 69d952fd84f..0145d57568a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs @@ -3050,12 +3050,7 @@ public async Task BackCompatibility_ConvenienceMethodParamOrderChanged() Assert.IsNotNull(body); var result = body!.ToDisplayString(); - Assert.AreEqual( - "global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1));\n\n" + - "using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1));\n" + - "global::System.ClientModel.ClientResult result = this.GetData(param3, param2, content, cancellationToken.ToRequestOptions());\n" + - "return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse());\n", - result); + Assert.AreEqual(Helpers.GetExpectedFromFile("Sync"), result); var asyncConvenienceMethod = convenienceMethods .FirstOrDefault(m => m.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Async)); @@ -3065,12 +3060,7 @@ public async Task BackCompatibility_ConvenienceMethodParamOrderChanged() Assert.IsNotNull(body); result = body!.ToDisplayString(); - Assert.AreEqual( - "global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1));\n\n" + - "using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1));\n" + - "global::System.ClientModel.ClientResult result = await this.GetDataAsync(param3, param2, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false);\n" + - "return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse());\n", - result); + Assert.AreEqual(Helpers.GetExpectedFromFile("Async"), result); } [Test] @@ -3147,12 +3137,7 @@ public async Task BackCompatibility_BothMethodsParamOrderChanged() Assert.IsNotNull(body); var result = body!.ToDisplayString(); - Assert.AreEqual( - "global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1));\n\n" + - "using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1));\n" + - "global::System.ClientModel.ClientResult result = this.UpdateResource(content, param2, param3, cancellationToken.ToRequestOptions());\n" + - "return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse());\n", - result); + Assert.AreEqual(Helpers.GetExpectedFromFile("Sync"), result); var asyncConvenienceMethod = convenienceMethods .FirstOrDefault(m => m.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Async)); @@ -3162,12 +3147,7 @@ public async Task BackCompatibility_BothMethodsParamOrderChanged() Assert.IsNotNull(body); result = body!.ToDisplayString(); - Assert.AreEqual( - "global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1));\n\n" + - "using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1));\n" + - "global::System.ClientModel.ClientResult result = await this.UpdateResourceAsync(content, param2, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false);\n" + - "return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse());\n", - result); + Assert.AreEqual(Helpers.GetExpectedFromFile("Async"), result); } [Test] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs new file mode 100644 index 00000000000..47c24d19bea --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs @@ -0,0 +1,7 @@ +global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); + +using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); +global::System.ClientModel.ClientResult result = await this.UpdateResourceAsync(content, param2, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs new file mode 100644 index 00000000000..4f08f0724f1 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs @@ -0,0 +1,7 @@ +global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); + +using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); +global::System.ClientModel.ClientResult result = this.UpdateResource(content, param2, param3, cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs new file mode 100644 index 00000000000..4667dec956b --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs @@ -0,0 +1,7 @@ +global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); + +using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); +global::System.ClientModel.ClientResult result = await this.GetDataAsync(param3, param2, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs new file mode 100644 index 00000000000..3792fa19dcd --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs @@ -0,0 +1,7 @@ +global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); + +using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); +global::System.ClientModel.ClientResult result = this.GetData(param3, param2, content, cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs index ecd8a142b0c..4b4aad7c3cd 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs @@ -6,6 +6,7 @@ using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -35,7 +36,9 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param2)); global::System.ClientModel.ClientResult result = this.GetData(param1, content, param3, param4, cancellationToken.ToRequestOptions()); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param1, string param2, bool? param3 = default, string param4 = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -44,7 +47,9 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param2)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, content, param3, param4, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } #pragma warning disable AZC0002 // Back-compat overload preserves the previous method signature where CancellationToken was the trailing parameter. Making it optional would introduce an ambiguous call with the new method. diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs index bc72ecb5894..78a58777566 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs @@ -5,6 +5,7 @@ using System; using System.ClientModel; using System.ClientModel.Primitives; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -28,14 +29,18 @@ public partial class TestClient { using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = this.GetData(param2, content, cancellationToken.ToRequestOptions()); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param2, string param1 = default, global::System.Threading.CancellationToken cancellationToken = default) { using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param2, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs index dec0cb1513e..5de1339c64e 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs @@ -6,6 +6,7 @@ using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -35,7 +36,9 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param2)); global::System.ClientModel.ClientResult result = this.GetData(param1, content, param3, cancellationToken.ToRequestOptions()); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param1, string param2, bool? param3 = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -44,7 +47,9 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param2)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, content, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } #pragma warning disable AZC0002 // Back-compat overload preserves the previous method signature where CancellationToken was the trailing parameter. Making it optional would introduce an ambiguous call with the new method. diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs index c1f11b6273c..732ac769151 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs @@ -2,9 +2,11 @@ #nullable disable +using System; using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Sample.Models; @@ -34,7 +36,9 @@ public partial class TestClient global::Sample.Argument.AssertNotNull(body, nameof(body)); global::System.ClientModel.ClientResult result = this.GetData(param1, body, param3, cancellationToken.ToRequestOptions()); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param1, global::Sample.Models.SampleModel body, bool? param3 = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -42,7 +46,9 @@ public partial class TestClient global::Sample.Argument.AssertNotNull(body, nameof(body)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, body, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } #pragma warning disable AZC0002 // Back-compat overload preserves the previous method signature where CancellationToken was the trailing parameter. Making it optional would introduce an ambiguous call with the new method. diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs index f97dddf4f4a..3b98a1bf806 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs @@ -2,9 +2,11 @@ #nullable disable +using System; using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -36,7 +38,9 @@ public partial class TestClient global::Sample.Argument.AssertNotNullOrEmpty(region, nameof(region)); global::System.ClientModel.ClientResult result = this.GetData(itemId, filter, region, sort, cancellationToken.ToRequestOptions()); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(string itemId, int filter, string region, string sort = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -45,7 +49,9 @@ public partial class TestClient global::Sample.Argument.AssertNotNullOrEmpty(region, nameof(region)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(itemId, filter, region, sort, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } #pragma warning disable AZC0002 // Back-compat overload preserves the previous method signature where CancellationToken was the trailing parameter. Making it optional would introduce an ambiguous call with the new method. diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs index ffa25774611..a000b37200e 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs @@ -6,6 +6,7 @@ using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -35,7 +36,9 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content0 = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(content)); global::System.ClientModel.ClientResult result = this.GetData(param1, content0, @select, cancellationToken.ToRequestOptions()); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param1, string content, string @select = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -44,7 +47,9 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content0 = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(content)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, content0, @select, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs index df446a2081b..633639a6700 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs @@ -5,6 +5,7 @@ using System; using System.ClientModel; using System.ClientModel.Primitives; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -34,7 +35,9 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = this.GetData(param2, param3, content, cancellationToken.ToRequestOptions()); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param2, bool param3, string param1, global::System.Threading.CancellationToken cancellationToken = default) @@ -43,7 +46,9 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param2, param3, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs index 6aadbf6d2f5..ce7639dbf6a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs @@ -909,7 +909,7 @@ public void ListMethodWithEnumParameter(bool isExtensible, InputRequestLocation convenienceMethod.BodyStatements!.ToDisplayString()); } } - #pragma warning restore SCME0005 +#pragma warning restore SCME0005 } // Enum bodies must be serialized via Utf8JsonWriter (not BinaryData.FromObjectAsJson) to stay AOT/trim safe (IL2026/IL3050). @@ -1559,21 +1559,29 @@ public void ListMethodIsRenamedToGet() } [TestCase(typeof(int))] + [TestCase(typeof(int), true)] + [TestCase(typeof(int?))] + [TestCase(typeof(int?), true)] [TestCase(typeof(long))] [TestCase(typeof(float))] [TestCase(typeof(double))] + [TestCase(typeof(decimal))] [TestCase(typeof(bool))] + [TestCase(typeof(bool?))] [TestCase(typeof(string))] [TestCase(typeof(Uri))] [TestCase(typeof(BinaryData))] [TestCase(typeof(DateTimeOffset))] [TestCase(typeof(TimeSpan))] - public void ScalarReturnTypeMethods(Type type) + [TestCase(typeof(TimeSpan?))] + public void ScalarReturnTypeMethods(Type type, bool isAsync = false) { - InputType? inputType = type switch + var underlyingType = Nullable.GetUnderlyingType(type); + InputType? inputType = (underlyingType ?? type) switch { { } t when t == typeof(float) => InputPrimitiveType.Float32, { } t when t == typeof(double) => InputPrimitiveType.Float64, + { } t when t == typeof(decimal) => new InputPrimitiveType(InputPrimitiveTypeKind.Decimal128, "decimal128", "TypeSpec.decimal128"), { } t when t == typeof(bool) => InputPrimitiveType.Boolean, { } t when t == typeof(string) => InputPrimitiveType.String, { } t when t == typeof(DateTimeOffset) => InputPrimitiveType.PlainDate, @@ -1585,6 +1593,11 @@ public void ScalarReturnTypeMethods(Type type) _ => null }; + if (underlyingType != null) + { + inputType = new InputNullableType(inputType!); + } + var inputOperation = InputFactory.Operation( "GetScalar", responses: [InputFactory.OperationResponse([200], inputType!)]); @@ -1600,9 +1613,54 @@ public void ScalarReturnTypeMethods(Type type) Assert.IsNotNull(methodCollection); var convenienceMethod = methodCollection.FirstOrDefault(m => m.Signature.Parameters.All(p => p.Name != "options") - && m.Signature.Name == $"{inputOperation.Name.ToIdentifierName()}"); + && m.Signature.Name == $"{inputOperation.Name.ToIdentifierName()}{(isAsync ? "Async" : "")}"); - Assert.AreEqual(Helpers.GetExpectedFromFile(type.Name), convenienceMethod!.BodyStatements!.ToDisplayString()); + var baselineName = underlyingType != null ? $"{underlyingType.Name}Nullable" : type.Name; + Assert.AreEqual(Helpers.GetExpectedFromFile($"{baselineName}{(isAsync ? "Async" : "")}"), convenienceMethod!.BodyStatements!.ToDisplayString()); + } + + [TestCase(true, true, false)] + [TestCase(true, false, false)] + [TestCase(false, true, false)] + [TestCase(false, false, false)] + [TestCase(true, true, true)] + [TestCase(false, false, true)] + public void EnumReturnTypeMethods(bool isString, bool isExtensible, bool isNullable) + { + InputType inputType = isString + ? InputFactory.StringEnum("TestEnum", [("Value", "value")], isExtensible: isExtensible) + : InputFactory.Int32Enum("TestEnum", [("Value", 1)], isExtensible: isExtensible); + if (isNullable) + { + inputType = new InputNullableType(inputType); + } + + var operation = InputFactory.Operation("GetEnum", responses: [InputFactory.OperationResponse([200], inputType)]); + var serviceMethod = InputFactory.BasicServiceMethod("GetEnum", operation); + var inputClient = InputFactory.Client("TestClient", methods: [serviceMethod]); + + MockHelpers.LoadMockGenerator(); + var client = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(inputClient); + var method = new ScmMethodProviderCollection(serviceMethod, client!) + .Single(m => m.Kind == ScmMethodKind.Convenience && m.Signature.Name == "GetEnum"); + + Assert.AreEqual(Helpers.GetExpectedFromFile($"{isString},{isExtensible},{isNullable}"), method.BodyStatements!.ToDisplayString()); + } + + [Test] + public void PlainTextReturnTypeMethods() + { + var operation = InputFactory.Operation("GetText", responses: + [InputFactory.OperationResponse([200], InputPrimitiveType.String, contentTypes: ["text/plain"])]); + var serviceMethod = InputFactory.BasicServiceMethod("GetText", operation); + var inputClient = InputFactory.Client("TestClient", methods: [serviceMethod]); + + MockHelpers.LoadMockGenerator(); + var client = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(inputClient); + var method = new ScmMethodProviderCollection(serviceMethod, client!) + .Single(m => m.Kind == ScmMethodKind.Convenience && m.Signature.Name == "GetText"); + + Assert.AreEqual(Helpers.GetExpectedFromFile(), method.BodyStatements!.ToDisplayString()); } [Test] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs new file mode 100644 index 00000000000..cf15ec0d514 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs new file mode 100644 index 00000000000..02d66f03515 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs new file mode 100644 index 00000000000..70834653d41 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetInt32()), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs new file mode 100644 index 00000000000..35876263549 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString().ToTestEnum(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs new file mode 100644 index 00000000000..ef8194f4df2 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs new file mode 100644 index 00000000000..666000fa161 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextReturnTypeMethods.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextReturnTypeMethods.cs new file mode 100644 index 00000000000..fa5d2eb3c6d --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextReturnTypeMethods.cs @@ -0,0 +1,2 @@ +global::System.ClientModel.ClientResult result = this.GetText(cancellationToken.ToRequestOptions()); +return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs index a418e708844..82c172f78f8 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs @@ -1,2 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetBoolean(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs new file mode 100644 index 00000000000..9bc1ea1a75b --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((bool?)null) : document.RootElement.GetBoolean(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs index dd967f8292f..9c4fa167439 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs @@ -1,2 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDateTimeOffset(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs new file mode 100644 index 00000000000..1236e585138 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDecimal(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs index b6d44cd9c10..3514cf0da05 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs @@ -1,2 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDouble(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs index cb0644c9c72..996b365188c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs @@ -1,2 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs new file mode 100644 index 00000000000..66d8edd58bb --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs new file mode 100644 index 00000000000..6c4818e8aba --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs new file mode 100644 index 00000000000..04cd1e0f43b --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs index 558d73a47ea..2de5e1fdd7f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs @@ -1,2 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt64(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs index df2eb3be24c..79ee02d7dc0 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs @@ -1,2 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetSingle(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs index 1cf02c42f1e..ae5734d099c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs @@ -1,2 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs index 9012ebf182c..a692c529b59 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs @@ -1,2 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToObjectFromJson(), result.GetRawResponse()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs new file mode 100644 index 00000000000..be31c359cc6 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs @@ -0,0 +1,4 @@ +global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); +global::System.BinaryData data = result.GetRawResponse().Content; +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::System.TimeSpan?)null) : document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs index 9e3d6da09ad..b6b37600972 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs @@ -12,6 +12,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Net.ServerSentEvents; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using SampleTypeSpec.Models.Custom; @@ -1086,7 +1087,9 @@ public virtual async Task GetUnknownValueAsync(RequestOptions opti public virtual ClientResult GetUnknownValue(CancellationToken cancellationToken = default) { ClientResult result = GetUnknownValue(cancellationToken.ToRequestOptions()); - return ClientResult.FromValue(new DaysOfWeekExtensibleEnum(result.GetRawResponse().Content.ToObjectFromJson()), result.GetRawResponse()); + BinaryData data = result.GetRawResponse().Content; + using JsonDocument document = JsonDocument.Parse(data); + return ClientResult.FromValue(new DaysOfWeekExtensibleEnum(document.RootElement.GetString()), result.GetRawResponse()); } /// get extensible enum. @@ -1095,7 +1098,9 @@ public virtual ClientResult GetUnknownValue(Cancellati public virtual async Task> GetUnknownValueAsync(CancellationToken cancellationToken = default) { ClientResult result = await GetUnknownValueAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return ClientResult.FromValue(new DaysOfWeekExtensibleEnum(result.GetRawResponse().Content.ToObjectFromJson()), result.GetRawResponse()); + BinaryData data = result.GetRawResponse().Content; + using JsonDocument document = JsonDocument.Parse(data); + return ClientResult.FromValue(new DaysOfWeekExtensibleEnum(document.RootElement.GetString()), result.GetRawResponse()); } /// From bea225a87acae21fcd528c60cd9af99ccd0df4a4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 18:36:59 +0000 Subject: [PATCH 03/21] fix(http-client-csharp): preserve BOM handling for primitive responses Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 6 +++-- ...ity_BothMethodsParamOrderChanged(Async).cs | 4 +-- ...lity_BothMethodsParamOrderChanged(Sync).cs | 4 +-- ...nvenienceMethodParamOrderChanged(Async).cs | 4 +-- ...onvenienceMethodParamOrderChanged(Sync).cs | 4 +-- ...ltipleNewOptionalNonBodyParametersAdded.cs | 9 ++++--- ...dyParameterDoesNotAddBackCompatOverload.cs | 9 ++++--- ...bility_NewOptionalNonBodyParameterAdded.cs | 9 ++++--- ...ionalNonBodyParameterAddedWithModelBody.cs | 10 +++---- ...rameterAddedWithPathAndHeaderParameters.cs | 10 +++---- ...ty_NewOptionalParameterWithReservedName.cs | 9 ++++--- ...edParameterDoesNotAddBackCompatOverload.cs | 9 ++++--- ...numReturnTypeMethods(False,False,False).cs | 4 +-- ...EnumReturnTypeMethods(False,False,True).cs | 4 +-- ...EnumReturnTypeMethods(False,True,False).cs | 4 +-- ...EnumReturnTypeMethods(True,False,False).cs | 4 +-- .../EnumReturnTypeMethods(True,True,False).cs | 4 +-- .../EnumReturnTypeMethods(True,True,True).cs | 4 +-- .../ScalarReturnTypeMethods(Boolean).cs | 4 +-- ...calarReturnTypeMethods(BooleanNullable).cs | 4 +-- ...ScalarReturnTypeMethods(DateTimeOffset).cs | 4 +-- .../ScalarReturnTypeMethods(Decimal).cs | 4 +-- .../ScalarReturnTypeMethods(Double).cs | 4 +-- .../ScalarReturnTypeMethods(Int32).cs | 4 +-- .../ScalarReturnTypeMethods(Int32Async).cs | 4 +-- .../ScalarReturnTypeMethods(Int32Nullable).cs | 4 +-- ...arReturnTypeMethods(Int32NullableAsync).cs | 4 +-- .../ScalarReturnTypeMethods(Int64).cs | 4 +-- .../ScalarReturnTypeMethods(Single).cs | 4 +-- .../ScalarReturnTypeMethods(String).cs | 4 +-- .../ScalarReturnTypeMethods(TimeSpan).cs | 4 +-- ...alarReturnTypeMethods(TimeSpanNullable).cs | 4 +-- .../Local.Tests/ExtensibleEnumTests.cs | 27 +++++++++++++++++++ .../src/Generated/SampleTypeSpecClient.cs | 9 ++++--- 34 files changed, 119 insertions(+), 84 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index 34790e14f2c..a67a8158cb8 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -639,10 +639,12 @@ private IEnumerable GetStackVariablesForReturnValueConversi && !responseBodyType.Equals(typeof(BinaryData)) && !IsPlainTextResponse(responseBodyType)) { + var data = result.GetRawResponse().Content(); + // The stream overload preserves UTF-8 BOM handling from ToObjectFromJson. var statements = new MethodBodyStatement[] { - Declare("data", result.GetRawResponse().Content(), out var data), - UsingDeclare("document", data.Parse(), out var document) + UsingDeclare("stream", data.ToStream(), out var stream), + UsingDeclare("document", JsonDocumentSnippets.Parse(stream), out var document) }; declarations["data"] = data; declarations["document"] = document; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs index 47c24d19bea..6de7dc53458 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs @@ -2,6 +2,6 @@ using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = await this.UpdateResourceAsync(content, param2, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs index 4f08f0724f1..71b9abbf9f0 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs @@ -2,6 +2,6 @@ using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = this.UpdateResource(content, param2, param3, cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs index 4667dec956b..de3fe14253f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs @@ -2,6 +2,6 @@ using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param3, param2, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs index 3792fa19dcd..3c1a5d8dfe1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs @@ -2,6 +2,6 @@ using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = this.GetData(param3, param2, content, cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs index 4b4aad7c3cd..c912c916118 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs @@ -6,6 +6,7 @@ using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.IO; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -36,8 +37,8 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param2)); global::System.ClientModel.ClientResult result = this.GetData(param1, content, param3, param4, cancellationToken.ToRequestOptions()); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } @@ -47,8 +48,8 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param2)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, content, param3, param4, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs index 78a58777566..ad97eaf9be1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs @@ -5,6 +5,7 @@ using System; using System.ClientModel; using System.ClientModel.Primitives; +using System.IO; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -29,8 +30,8 @@ public partial class TestClient { using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = this.GetData(param2, content, cancellationToken.ToRequestOptions()); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } @@ -38,8 +39,8 @@ public partial class TestClient { using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param2, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs index 5de1339c64e..fc71052b495 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs @@ -6,6 +6,7 @@ using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.IO; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -36,8 +37,8 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param2)); global::System.ClientModel.ClientResult result = this.GetData(param1, content, param3, cancellationToken.ToRequestOptions()); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } @@ -47,8 +48,8 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param2)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, content, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs index 732ac769151..4aa676b5f2b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs @@ -2,10 +2,10 @@ #nullable disable -using System; using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.IO; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -36,8 +36,8 @@ public partial class TestClient global::Sample.Argument.AssertNotNull(body, nameof(body)); global::System.ClientModel.ClientResult result = this.GetData(param1, body, param3, cancellationToken.ToRequestOptions()); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } @@ -46,8 +46,8 @@ public partial class TestClient global::Sample.Argument.AssertNotNull(body, nameof(body)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, body, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs index 3b98a1bf806..e046039d6a4 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs @@ -2,10 +2,10 @@ #nullable disable -using System; using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.IO; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -38,8 +38,8 @@ public partial class TestClient global::Sample.Argument.AssertNotNullOrEmpty(region, nameof(region)); global::System.ClientModel.ClientResult result = this.GetData(itemId, filter, region, sort, cancellationToken.ToRequestOptions()); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } @@ -49,8 +49,8 @@ public partial class TestClient global::Sample.Argument.AssertNotNullOrEmpty(region, nameof(region)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(itemId, filter, region, sort, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs index a000b37200e..fac41dddf6d 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs @@ -6,6 +6,7 @@ using System.ClientModel; using System.ClientModel.Primitives; using System.ComponentModel; +using System.IO; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -36,8 +37,8 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content0 = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(content)); global::System.ClientModel.ClientResult result = this.GetData(param1, content0, @select, cancellationToken.ToRequestOptions()); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } @@ -47,8 +48,8 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content0 = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(content)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, content0, @select, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs index 633639a6700..43264ee1b2c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs @@ -5,6 +5,7 @@ using System; using System.ClientModel; using System.ClientModel.Primitives; +using System.IO; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -35,8 +36,8 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = this.GetData(param2, param3, content, cancellationToken.ToRequestOptions()); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } @@ -46,8 +47,8 @@ public partial class TestClient using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); global::System.ClientModel.ClientResult result = await this.GetDataAsync(param2, param3, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); - global::System.BinaryData data = result.GetRawResponse().Content; - using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs index cf15ec0d514..8061161a972 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs index 02d66f03515..e7dd0a3014f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs index 70834653d41..dfca1a2aff1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetInt32()), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs index 35876263549..4af25f57081 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString().ToTestEnum(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs index ef8194f4df2..f5c5e5776b6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs index 666000fa161..d9891706fd4 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs index 82c172f78f8..2baefc83537 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetBoolean(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs index 9bc1ea1a75b..d4b91918ecd 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((bool?)null) : document.RootElement.GetBoolean(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs index 9c4fa167439..a877064a916 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDateTimeOffset(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs index 1236e585138..a3b87b103eb 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDecimal(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs index 3514cf0da05..5fd1536283c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDouble(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs index 996b365188c..2d3b19cb4ee 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs index 66d8edd58bb..5794a99428f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs index 6c4818e8aba..3901a9bfa12 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs index 04cd1e0f43b..16126a5c58b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs index 2de5e1fdd7f..b32aeb63258 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt64(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs index 79ee02d7dc0..03a8dc023c5 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetSingle(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs index ae5734d099c..ea431eea35e 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs index a692c529b59..809ae51f500 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs index be31c359cc6..58c6c56e1d6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs @@ -1,4 +1,4 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); +using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); +using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::System.TimeSpan?)null) : document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); diff --git a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs index c348067affa..99e188a2ded 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs @@ -2,9 +2,13 @@ // Licensed under the MIT License. using System; +using System.ClientModel; +using System.ClientModel.Primitives; using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Threading.Tasks; +using Moq; using NUnit.Framework; using SampleTypeSpec; @@ -12,6 +16,29 @@ namespace TestProjects.Local.Tests { public class ExtensibleEnumTests { + [TestCase(false, false)] + [TestCase(false, true)] + [TestCase(true, false)] + [TestCase(true, true)] + public async Task EnumResponseDeserialization(bool hasBom, bool isAsync) + { + var content = BinaryData.FromString((hasBom ? "\uFEFF" : "") + "\"Monday\""); + var response = new Mock(); + response.SetupGet(r => r.Content).Returns(content); + var protocolResult = ClientResult.FromResponse(response.Object); + var client = new Mock { CallBase = true }; + client.Setup(c => c.GetUnknownValue(It.IsAny())).Returns(protocolResult); + client.Setup(c => c.GetUnknownValueAsync(It.IsAny())).ReturnsAsync(protocolResult); + + var result = isAsync + ? await client.Object.GetUnknownValueAsync() + : client.Object.GetUnknownValue(); + + Assert.AreEqual("Monday", result.Value.ToString()); + Assert.AreSame(response.Object, result.GetRawResponse()); + Assert.AreSame(content, result.GetRawResponse().Content); + } + [TestCase("a", "A", true)] [TestCase("A", "A", true)] [TestCase("A", "B", false)] diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs index b6b37600972..54818f20ae8 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs @@ -10,6 +10,7 @@ using System.ClientModel.Primitives; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.IO; using System.Linq; using System.Net.ServerSentEvents; using System.Text.Json; @@ -1087,8 +1088,8 @@ public virtual async Task GetUnknownValueAsync(RequestOptions opti public virtual ClientResult GetUnknownValue(CancellationToken cancellationToken = default) { ClientResult result = GetUnknownValue(cancellationToken.ToRequestOptions()); - BinaryData data = result.GetRawResponse().Content; - using JsonDocument document = JsonDocument.Parse(data); + using Stream stream = result.GetRawResponse().Content.ToStream(); + using JsonDocument document = JsonDocument.Parse(stream); return ClientResult.FromValue(new DaysOfWeekExtensibleEnum(document.RootElement.GetString()), result.GetRawResponse()); } @@ -1098,8 +1099,8 @@ public virtual ClientResult GetUnknownValue(Cancellati public virtual async Task> GetUnknownValueAsync(CancellationToken cancellationToken = default) { ClientResult result = await GetUnknownValueAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); - BinaryData data = result.GetRawResponse().Content; - using JsonDocument document = JsonDocument.Parse(data); + using Stream stream = result.GetRawResponse().Content.ToStream(); + using JsonDocument document = JsonDocument.Parse(stream); return ClientResult.FromValue(new DaysOfWeekExtensibleEnum(document.RootElement.GetString()), result.GetRawResponse()); } From e5e08e6320d8560236bc2ebf0be31d285ff900e1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 19:20:33 +0000 Subject: [PATCH 04/21] test(http-client-csharp): validate complete primitive response methods Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../ClientProviders/ClientProviderTests.cs | 20 +++++++++++-------- ...ity_BothMethodsParamOrderChanged(Async).cs | 15 ++++++++------ ...lity_BothMethodsParamOrderChanged(Sync).cs | 15 ++++++++------ ...nvenienceMethodParamOrderChanged(Async).cs | 15 ++++++++------ ...onvenienceMethodParamOrderChanged(Sync).cs | 15 ++++++++------ .../ScmMethodProviderCollectionTests.cs | 12 ++++++++--- ...numReturnTypeMethods(False,False,False).cs | 11 ++++++---- ...EnumReturnTypeMethods(False,False,True).cs | 11 ++++++---- ...EnumReturnTypeMethods(False,True,False).cs | 11 ++++++---- ...EnumReturnTypeMethods(True,False,False).cs | 11 ++++++---- .../EnumReturnTypeMethods(True,True,False).cs | 11 ++++++---- .../EnumReturnTypeMethods(True,True,True).cs | 11 ++++++---- .../PlainTextReturnTypeMethods.cs | 7 +++++-- .../ScalarReturnTypeMethods(BinaryData).cs | 7 +++++-- .../ScalarReturnTypeMethods(Boolean).cs | 11 ++++++---- ...calarReturnTypeMethods(BooleanNullable).cs | 11 ++++++---- ...ScalarReturnTypeMethods(DateTimeOffset).cs | 11 ++++++---- .../ScalarReturnTypeMethods(Decimal).cs | 11 ++++++---- .../ScalarReturnTypeMethods(Double).cs | 11 ++++++---- .../ScalarReturnTypeMethods(Int32).cs | 11 ++++++---- .../ScalarReturnTypeMethods(Int32Async).cs | 11 ++++++---- .../ScalarReturnTypeMethods(Int32Nullable).cs | 11 ++++++---- ...arReturnTypeMethods(Int32NullableAsync).cs | 11 ++++++---- .../ScalarReturnTypeMethods(Int64).cs | 11 ++++++---- .../ScalarReturnTypeMethods(Single).cs | 11 ++++++---- .../ScalarReturnTypeMethods(String).cs | 11 ++++++---- .../ScalarReturnTypeMethods(TimeSpan).cs | 11 ++++++---- ...alarReturnTypeMethods(TimeSpanNullable).cs | 11 ++++++---- .../ScalarReturnTypeMethods(Uri).cs | 13 +++++++----- 29 files changed, 215 insertions(+), 124 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs index 0145d57568a..fef94f5ff15 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/ClientProviderTests.cs @@ -3049,8 +3049,9 @@ public async Task BackCompatibility_ConvenienceMethodParamOrderChanged() var body = syncConvenienceMethod!.BodyStatements; Assert.IsNotNull(body); - var result = body!.ToDisplayString(); - Assert.AreEqual(Helpers.GetExpectedFromFile("Sync"), result); + using var syncWriter = new CodeWriter(); + syncWriter.WriteMethod(syncConvenienceMethod); + Assert.AreEqual(Helpers.GetExpectedFromFile("Sync"), syncWriter.ToString(false)); var asyncConvenienceMethod = convenienceMethods .FirstOrDefault(m => m.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Async)); @@ -3059,8 +3060,9 @@ public async Task BackCompatibility_ConvenienceMethodParamOrderChanged() body = asyncConvenienceMethod!.BodyStatements; Assert.IsNotNull(body); - result = body!.ToDisplayString(); - Assert.AreEqual(Helpers.GetExpectedFromFile("Async"), result); + using var asyncWriter = new CodeWriter(); + asyncWriter.WriteMethod(asyncConvenienceMethod); + Assert.AreEqual(Helpers.GetExpectedFromFile("Async"), asyncWriter.ToString(false)); } [Test] @@ -3136,8 +3138,9 @@ public async Task BackCompatibility_BothMethodsParamOrderChanged() var body = syncConvenienceMethod!.BodyStatements; Assert.IsNotNull(body); - var result = body!.ToDisplayString(); - Assert.AreEqual(Helpers.GetExpectedFromFile("Sync"), result); + using var syncWriter = new CodeWriter(); + syncWriter.WriteMethod(syncConvenienceMethod); + Assert.AreEqual(Helpers.GetExpectedFromFile("Sync"), syncWriter.ToString(false)); var asyncConvenienceMethod = convenienceMethods .FirstOrDefault(m => m.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Async)); @@ -3146,8 +3149,9 @@ public async Task BackCompatibility_BothMethodsParamOrderChanged() body = asyncConvenienceMethod!.BodyStatements; Assert.IsNotNull(body); - result = body!.ToDisplayString(); - Assert.AreEqual(Helpers.GetExpectedFromFile("Async"), result); + using var asyncWriter = new CodeWriter(); + asyncWriter.WriteMethod(asyncConvenienceMethod); + Assert.AreEqual(Helpers.GetExpectedFromFile("Async"), asyncWriter.ToString(false)); } [Test] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs index 6de7dc53458..a1621ae50c7 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs @@ -1,7 +1,10 @@ -global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); +public virtual async global::System.Threading.Tasks.Task> UpdateResourceAsync(string param1, int param2, bool param3, global::System.Threading.CancellationToken cancellationToken = default) +{ + global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); -using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); -global::System.ClientModel.ClientResult result = await this.UpdateResourceAsync(content, param2, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); + global::System.ClientModel.ClientResult result = await this.UpdateResourceAsync(content, param2, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs index 71b9abbf9f0..725cdf8bd69 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs @@ -1,7 +1,10 @@ -global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); +public virtual global::System.ClientModel.ClientResult UpdateResource(string param1, int param2, bool param3, global::System.Threading.CancellationToken cancellationToken = default) +{ + global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); -using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); -global::System.ClientModel.ClientResult result = this.UpdateResource(content, param2, param3, cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); + global::System.ClientModel.ClientResult result = this.UpdateResource(content, param2, param3, cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs index de3fe14253f..ef9ce3a313b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs @@ -1,7 +1,10 @@ -global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); +public virtual async global::System.Threading.Tasks.Task> GetDataAsync(string param1, int param2, bool param3, global::System.Threading.CancellationToken cancellationToken = default) +{ + global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); -using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); -global::System.ClientModel.ClientResult result = await this.GetDataAsync(param3, param2, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); + global::System.ClientModel.ClientResult result = await this.GetDataAsync(param3, param2, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs index 3c1a5d8dfe1..fa20dabd5d7 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs @@ -1,7 +1,10 @@ -global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); +public virtual global::System.ClientModel.ClientResult GetData(string param1, int param2, bool param3, global::System.Threading.CancellationToken cancellationToken = default) +{ + global::Sample.Argument.AssertNotNullOrEmpty(param1, nameof(param1)); -using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); -global::System.ClientModel.ClientResult result = this.GetData(param3, param2, content, cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + using global::System.ClientModel.BinaryContent content = global::System.ClientModel.BinaryContent.Create(global::System.BinaryData.FromString(param1)); + global::System.ClientModel.ClientResult result = this.GetData(param3, param2, content, cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs index ce7639dbf6a..99f08608b3d 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs @@ -1616,7 +1616,9 @@ public void ScalarReturnTypeMethods(Type type, bool isAsync = false) && m.Signature.Name == $"{inputOperation.Name.ToIdentifierName()}{(isAsync ? "Async" : "")}"); var baselineName = underlyingType != null ? $"{underlyingType.Name}Nullable" : type.Name; - Assert.AreEqual(Helpers.GetExpectedFromFile($"{baselineName}{(isAsync ? "Async" : "")}"), convenienceMethod!.BodyStatements!.ToDisplayString()); + using var writer = new CodeWriter(); + writer.WriteMethod(convenienceMethod!); + Assert.AreEqual(Helpers.GetExpectedFromFile($"{baselineName}{(isAsync ? "Async" : "")}"), writer.ToString(false)); } [TestCase(true, true, false)] @@ -1644,7 +1646,9 @@ public void EnumReturnTypeMethods(bool isString, bool isExtensible, bool isNulla var method = new ScmMethodProviderCollection(serviceMethod, client!) .Single(m => m.Kind == ScmMethodKind.Convenience && m.Signature.Name == "GetEnum"); - Assert.AreEqual(Helpers.GetExpectedFromFile($"{isString},{isExtensible},{isNullable}"), method.BodyStatements!.ToDisplayString()); + using var writer = new CodeWriter(); + writer.WriteMethod(method); + Assert.AreEqual(Helpers.GetExpectedFromFile($"{isString},{isExtensible},{isNullable}"), writer.ToString(false)); } [Test] @@ -1660,7 +1664,9 @@ public void PlainTextReturnTypeMethods() var method = new ScmMethodProviderCollection(serviceMethod, client!) .Single(m => m.Kind == ScmMethodKind.Convenience && m.Signature.Name == "GetText"); - Assert.AreEqual(Helpers.GetExpectedFromFile(), method.BodyStatements!.ToDisplayString()); + using var writer = new CodeWriter(); + writer.WriteMethod(method); + Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); } [Test] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs index 8061161a972..e272f7b5645 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs index e7dd0a3014f..107a3af9d1f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs index dfca1a2aff1..e038285e893 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetInt32()), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetInt32()), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs index 4af25f57081..e7bf466d31d 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString().ToTestEnum(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString().ToTestEnum(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs index f5c5e5776b6..cef13277068 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs index d9891706fd4..b627389142a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextReturnTypeMethods.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextReturnTypeMethods.cs index fa5d2eb3c6d..95920e5f6ba 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextReturnTypeMethods.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextReturnTypeMethods.cs @@ -1,2 +1,5 @@ -global::System.ClientModel.ClientResult result = this.GetText(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToString(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetText(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetText(cancellationToken.ToRequestOptions()); + return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content.ToString(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BinaryData).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BinaryData).cs index efcc1bbf33a..5069a349ea3 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BinaryData).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BinaryData).cs @@ -1,2 +1,5 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content, result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs index 2baefc83537..e7fb61baf44 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetBoolean(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetBoolean(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs index d4b91918ecd..fab18b5d6a8 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((bool?)null) : document.RootElement.GetBoolean(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((bool?)null) : document.RootElement.GetBoolean(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs index a877064a916..7418cfee158 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDateTimeOffset(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDateTimeOffset(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs index a3b87b103eb..80c21d2af40 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDecimal(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDecimal(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs index 5fd1536283c..2b3fc4bb08b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDouble(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDouble(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs index 2d3b19cb4ee..091dc5e833d 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs index 5794a99428f..db499d75196 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); +public virtual async global::System.Threading.Tasks.Task> GetScalarAsync(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs index 3901a9bfa12..7c7241c2bf5 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs index 16126a5c58b..bc9bf98057b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); +public virtual async global::System.Threading.Tasks.Task> GetScalarAsync(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs index b32aeb63258..8a3480d044f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt64(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt64(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs index 03a8dc023c5..f08f48c32e1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetSingle(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetSingle(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs index ea431eea35e..5e5251f0a56 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs index 809ae51f500..7354733900c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs index 58c6c56e1d6..defe1586ff0 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs @@ -1,4 +1,7 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); -return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::System.TimeSpan?)null) : document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::System.TimeSpan?)null) : document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Uri).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Uri).cs index 3a0a7cfdd2e..c6a19f33fe1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Uri).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Uri).cs @@ -1,5 +1,8 @@ -global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); -global::System.BinaryData data = result.GetRawResponse().Content; -using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); -global::System.Text.Json.JsonElement element = document.RootElement; -return global::System.ClientModel.ClientResult.FromValue(new global::System.Uri(element.GetString(), global::System.UriKind.RelativeOrAbsolute), result.GetRawResponse()); +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + global::System.BinaryData data = result.GetRawResponse().Content; + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data); + global::System.Text.Json.JsonElement element = document.RootElement; + return global::System.ClientModel.ClientResult.FromValue(new global::System.Uri(element.GetString(), global::System.UriKind.RelativeOrAbsolute), result.GetRawResponse()); +} From 06ea139aecedd259d9e8627a0adb1f17e95aae1c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 19:31:58 +0000 Subject: [PATCH 05/21] Fix cspell error for FEFF in ExtensibleEnumTests.cs Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs index 99e188a2ded..e07267199cf 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +// cspell:ignore FEFF + using System; using System.ClientModel; using System.ClientModel.Primitives; From 927840511fbef53ef828e85fd8186e42098b2bbc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 19:46:37 +0000 Subject: [PATCH 06/21] Cache enum/scalar response value in a variable instead of inline ternary Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 50 +++++++++++++------ ...ity_BothMethodsParamOrderChanged(Async).cs | 3 +- ...lity_BothMethodsParamOrderChanged(Sync).cs | 3 +- ...nvenienceMethodParamOrderChanged(Async).cs | 3 +- ...onvenienceMethodParamOrderChanged(Sync).cs | 3 +- ...ltipleNewOptionalNonBodyParametersAdded.cs | 6 ++- ...dyParameterDoesNotAddBackCompatOverload.cs | 6 ++- ...bility_NewOptionalNonBodyParameterAdded.cs | 6 ++- ...ionalNonBodyParameterAddedWithModelBody.cs | 6 ++- ...rameterAddedWithPathAndHeaderParameters.cs | 6 ++- ...ty_NewOptionalParameterWithReservedName.cs | 6 ++- ...edParameterDoesNotAddBackCompatOverload.cs | 6 ++- ...numReturnTypeMethods(False,False,False).cs | 3 +- ...EnumReturnTypeMethods(False,False,True).cs | 3 +- ...EnumReturnTypeMethods(False,True,False).cs | 3 +- ...EnumReturnTypeMethods(True,False,False).cs | 3 +- .../EnumReturnTypeMethods(True,True,False).cs | 3 +- .../EnumReturnTypeMethods(True,True,True).cs | 3 +- .../ScalarReturnTypeMethods(Boolean).cs | 3 +- ...calarReturnTypeMethods(BooleanNullable).cs | 3 +- ...ScalarReturnTypeMethods(DateTimeOffset).cs | 3 +- .../ScalarReturnTypeMethods(Decimal).cs | 3 +- .../ScalarReturnTypeMethods(Double).cs | 3 +- .../ScalarReturnTypeMethods(Int32).cs | 3 +- .../ScalarReturnTypeMethods(Int32Async).cs | 3 +- .../ScalarReturnTypeMethods(Int32Nullable).cs | 3 +- ...arReturnTypeMethods(Int32NullableAsync).cs | 3 +- .../ScalarReturnTypeMethods(Int64).cs | 3 +- .../ScalarReturnTypeMethods(Single).cs | 3 +- .../ScalarReturnTypeMethods(String).cs | 3 +- .../ScalarReturnTypeMethods(TimeSpan).cs | 3 +- ...alarReturnTypeMethods(TimeSpanNullable).cs | 3 +- 32 files changed, 110 insertions(+), 54 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index a67a8158cb8..6672de77d60 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -295,7 +295,7 @@ .. GetStackVariablesForProtocolParamConversion(convenienceBodyParameters, out va Declare("result", This.Invoke(protocolMethod.Signature, [.. GetProtocolMethodArguments(paramDeclarations)], isAsync).ToApi(), out ClientResponseApi result), .. GetStackVariablesForReturnValueConversion(result, responseBodyType, isAsync, out var resultDeclarations), IsConvertibleFromBinaryData(responseBodyType) - ? Return(result.FromValue(GetResultConversion(result, result.GetRawResponse(), responseBodyType, resultDeclarations), result.GetRawResponse())) + ? GetResultConversionStatements(result, result.GetRawResponse(), responseBodyType, resultDeclarations) : new[] { @@ -854,6 +854,39 @@ private MethodBodyStatement AddElement(ValueExpression? dictKey, ValueExpression return scopedApi.Add(element); } + private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi result, HttpResponseApi response, CSharpType responseBodyType, Dictionary declarations) + { + var isSpecialCaseType = responseBodyType.Equals(typeof(BinaryData)) + || responseBodyType.IsReadOnlyMemory + || responseBodyType.IsList + || responseBodyType.IsDictionary + || IsPlainTextResponse(responseBodyType); + + if (!isSpecialCaseType && (responseBodyType.IsFrameworkType || responseBodyType.IsEnum)) + { + var element = declarations["document"].As().RootElement(); + var deserializedValue = ScmCodeModelGenerator.Instance.TypeFactory.DeserializeJsonValue( + responseBodyType.WithNullable(false), + element, + declarations["data"].As(), + ScmCodeModelGenerator.Instance.ModelSerializationExtensionsDefinition.WireOptionsField.As(), + responseBodyType.Equals(typeof(TimeSpan)) || responseBodyType.Equals(typeof(TimeSpan?)) + ? SerializationFormat.Duration_Constant + : SerializationFormat.Default); + var valueExpression = responseBodyType.IsNullable + ? new TernaryConditionalExpression(element.ValueKindEqualsNull(), Null.CastTo(responseBodyType), deserializedValue) + : deserializedValue; + + return + [ + Declare("value", responseBodyType, valueExpression, out var value), + Return(result.FromValue(value, response)) + ]; + } + + return [Return(result.FromValue(GetResultConversion(result, response, responseBodyType, declarations), response))]; + } + private ValueExpression GetResultConversion(ClientResponseApi result, HttpResponseApi response, CSharpType responseBodyType, Dictionary declarations) { if (responseBodyType.Equals(typeof(BinaryData))) @@ -876,21 +909,6 @@ private ValueExpression GetResultConversion(ClientResponseApi result, HttpRespon { return response.Content().InvokeToString(); } - if (responseBodyType.IsFrameworkType || responseBodyType.IsEnum) - { - var element = declarations["document"].As().RootElement(); - var value = ScmCodeModelGenerator.Instance.TypeFactory.DeserializeJsonValue( - responseBodyType.WithNullable(false), - element, - declarations["data"].As(), - ScmCodeModelGenerator.Instance.ModelSerializationExtensionsDefinition.WireOptionsField.As(), - responseBodyType.Equals(typeof(TimeSpan)) || responseBodyType.Equals(typeof(TimeSpan?)) - ? SerializationFormat.Duration_Constant - : SerializationFormat.Default); - return responseBodyType.IsNullable - ? new TernaryConditionalExpression(element.ValueKindEqualsNull(), Null.CastTo(responseBodyType), value) - : value; - } return result.CastTo(responseBodyType); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs index a1621ae50c7..4f4f9c88a54 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Async).cs @@ -6,5 +6,6 @@ global::System.ClientModel.ClientResult result = await this.UpdateResourceAsync(content, param2, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs index 725cdf8bd69..9647d755f34 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_BothMethodsParamOrderChanged(Sync).cs @@ -6,5 +6,6 @@ global::System.ClientModel.ClientResult result = this.UpdateResource(content, param2, param3, cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs index ef9ce3a313b..98e5b272a4c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Async).cs @@ -6,5 +6,6 @@ global::System.ClientModel.ClientResult result = await this.GetDataAsync(param3, param2, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs index fa20dabd5d7..70c3d6840d5 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_ConvenienceMethodParamOrderChanged(Sync).cs @@ -6,5 +6,6 @@ global::System.ClientModel.ClientResult result = this.GetData(param3, param2, content, cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs index c912c916118..9f5ac587a7a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_MultipleNewOptionalNonBodyParametersAdded.cs @@ -39,7 +39,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = this.GetData(param1, content, param3, param4, cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param1, string param2, bool? param3 = default, string param4 = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -50,7 +51,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, content, param3, param4, cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } #pragma warning disable AZC0002 // Back-compat overload preserves the previous method signature where CancellationToken was the trailing parameter. Making it optional would introduce an ambiguous call with the new method. diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs index ad97eaf9be1..b2b7509ea97 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalBodyParameterDoesNotAddBackCompatOverload.cs @@ -32,7 +32,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = this.GetData(param2, content, cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param2, string param1 = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -41,7 +42,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = await this.GetDataAsync(param2, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs index fc71052b495..faa71292be9 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAdded.cs @@ -39,7 +39,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = this.GetData(param1, content, param3, cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param1, string param2, bool? param3 = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -50,7 +51,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, content, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } #pragma warning disable AZC0002 // Back-compat overload preserves the previous method signature where CancellationToken was the trailing parameter. Making it optional would introduce an ambiguous call with the new method. diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs index 4aa676b5f2b..06887b83305 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithModelBody.cs @@ -38,7 +38,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = this.GetData(param1, body, param3, cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param1, global::Sample.Models.SampleModel body, bool? param3 = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -48,7 +49,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, body, param3, cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } #pragma warning disable AZC0002 // Back-compat overload preserves the previous method signature where CancellationToken was the trailing parameter. Making it optional would introduce an ambiguous call with the new method. diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs index e046039d6a4..0186a8403aa 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalNonBodyParameterAddedWithPathAndHeaderParameters.cs @@ -40,7 +40,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = this.GetData(itemId, filter, region, sort, cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(string itemId, int filter, string region, string sort = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -51,7 +52,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = await this.GetDataAsync(itemId, filter, region, sort, cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } #pragma warning disable AZC0002 // Back-compat overload preserves the previous method signature where CancellationToken was the trailing parameter. Making it optional would introduce an ambiguous call with the new method. diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs index fac41dddf6d..88c49fd8973 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewOptionalParameterWithReservedName.cs @@ -39,7 +39,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = this.GetData(param1, content0, @select, cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param1, string content, string @select = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -50,7 +51,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = await this.GetDataAsync(param1, content0, @select, cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs index 43264ee1b2c..01908bd29d0 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientProviders/TestData/ClientProviderTests/BackCompatibility_NewRequiredParameterDoesNotAddBackCompatOverload.cs @@ -38,7 +38,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = this.GetData(param2, param3, content, cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } public virtual async global::System.Threading.Tasks.Task> GetDataAsync(int param2, bool param3, string param1, global::System.Threading.CancellationToken cancellationToken = default) @@ -49,7 +50,8 @@ public partial class TestClient global::System.ClientModel.ClientResult result = await this.GetDataAsync(param2, param3, content, cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs index e272f7b5645..0dd4072a034 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,False).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); + global::Sample.Models.TestEnum value = document.RootElement.GetInt32().ToTestEnum(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs index 107a3af9d1f..9555f3050c6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,False,True).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : document.RootElement.GetInt32().ToTestEnum(), result.GetRawResponse()); + global::Sample.Models.TestEnum? value = (document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : document.RootElement.GetInt32().ToTestEnum(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs index e038285e893..5d6b1510df6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,False).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetInt32()), result.GetRawResponse()); + global::Sample.Models.TestEnum value = new global::Sample.Models.TestEnum(document.RootElement.GetInt32()); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs index e7bf466d31d..c9592dd36ce 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,False).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString().ToTestEnum(), result.GetRawResponse()); + global::Sample.Models.TestEnum value = document.RootElement.GetString().ToTestEnum(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs index cef13277068..e3a9e300663 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,False).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); + global::Sample.Models.TestEnum value = new global::Sample.Models.TestEnum(document.RootElement.GetString()); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs index b627389142a..4db817d4b6f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,True,True).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(document.RootElement.GetString()), result.GetRawResponse()); + global::Sample.Models.TestEnum? value = (document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(document.RootElement.GetString()); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs index e7fb61baf44..dd042ee9fac 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Boolean).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetBoolean(), result.GetRawResponse()); + bool value = document.RootElement.GetBoolean(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs index fab18b5d6a8..4c349955a9a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(BooleanNullable).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((bool?)null) : document.RootElement.GetBoolean(), result.GetRawResponse()); + bool? value = (document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((bool?)null) : document.RootElement.GetBoolean(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs index 7418cfee158..c662a01442e 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(DateTimeOffset).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDateTimeOffset(), result.GetRawResponse()); + global::System.DateTimeOffset value = document.RootElement.GetDateTimeOffset(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs index 80c21d2af40..ec18a48717d 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Decimal).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDecimal(), result.GetRawResponse()); + decimal value = document.RootElement.GetDecimal(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs index 2b3fc4bb08b..01640da0a2c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Double).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetDouble(), result.GetRawResponse()); + double value = document.RootElement.GetDouble(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs index 091dc5e833d..7daaac8eb0b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); + int value = document.RootElement.GetInt32(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs index db499d75196..cbabcf7db21 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Async).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt32(), result.GetRawResponse()); + int value = document.RootElement.GetInt32(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs index 7c7241c2bf5..d06a4e400b4 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32Nullable).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); + int? value = (document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs index bc9bf98057b..833c8a112f0 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int32NullableAsync).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = await this.GetScalarAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(), result.GetRawResponse()); + int? value = (document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((int?)null) : document.RootElement.GetInt32(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs index 8a3480d044f..85908b80a17 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Int64).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetInt64(), result.GetRawResponse()); + long value = document.RootElement.GetInt64(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs index f08f48c32e1..aed0acb79b7 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(Single).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetSingle(), result.GetRawResponse()); + float value = document.RootElement.GetSingle(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs index 5e5251f0a56..ce8389519d2 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(String).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetString(), result.GetRawResponse()); + string value = document.RootElement.GetString(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs index 7354733900c..3ef165eb6ee 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpan).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue(document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); + global::System.TimeSpan value = document.RootElement.GetTimeSpan("c"); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs index defe1586ff0..a28d0b0e0f8 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ScalarReturnTypeMethods(TimeSpanNullable).cs @@ -3,5 +3,6 @@ global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); - return global::System.ClientModel.ClientResult.FromValue((document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::System.TimeSpan?)null) : document.RootElement.GetTimeSpan("c"), result.GetRawResponse()); + global::System.TimeSpan? value = (document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::System.TimeSpan?)null) : document.RootElement.GetTimeSpan("c"); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } From 248bdc9fb8b214f99bda0fef44247a163413cad5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 20:09:19 +0000 Subject: [PATCH 07/21] Handle text/plain content type for primitive and enum responses Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 91 ++++++++++++++++++- .../ScmMethodProviderCollectionTests.cs | 53 +++++++++++ ...nTextEnumReturnTypeMethods(False,False).cs | 6 ++ ...inTextEnumReturnTypeMethods(False,True).cs | 6 ++ ...inTextEnumReturnTypeMethods(True,False).cs | 6 ++ ...ainTextEnumReturnTypeMethods(True,True).cs | 6 ++ ...ainTextScalarReturnTypeMethods(Boolean).cs | 6 ++ ...PlainTextScalarReturnTypeMethods(Int32).cs | 6 ++ ...inTextScalarReturnTypeMethods(TimeSpan).cs | 6 ++ .../Local.Tests/ExtensibleEnumTests.cs | 2 +- .../src/Generated/SampleTypeSpecClient.cs | 12 +-- 11 files changed, 189 insertions(+), 11 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Boolean).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpan).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index 6672de77d60..4bf7c8cb1b0 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -1,12 +1,15 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +// cspell:ignore FEFF + using System; using System.ClientModel; using System.ClientModel.Primitives; using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Globalization; using System.IO; using System.Linq; using System.Net.ServerSentEvents; @@ -637,7 +640,7 @@ private IEnumerable GetStackVariablesForReturnValueConversi if (IsConvertibleFromBinaryData(responseBodyType) && (responseBodyType.IsFrameworkType || responseBodyType.IsEnum) && !responseBodyType.Equals(typeof(BinaryData)) - && !IsPlainTextResponse(responseBodyType)) + && !IsPlainTextConversion(responseBodyType)) { var data = result.GetRawResponse().Content(); // The stream overload preserves UTF-8 BOM handling from ToObjectFromJson. @@ -856,6 +859,21 @@ private MethodBodyStatement AddElement(ValueExpression? dictKey, ValueExpression private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi result, HttpResponseApi response, CSharpType responseBodyType, Dictionary declarations) { + // Operations that return a non-string primitive or enum with a text/plain content type are not JSON-encoded, + // so the value must be parsed from the raw response text instead of going through JsonDocument. A leading + // UTF-8 BOM is stripped first to match the tolerance previously provided by JsonDocument/ToObjectFromJson. + if (IsPlainTextConversion(responseBodyType) && !responseBodyType.Equals(typeof(string))) + { + var content = response.Content().InvokeToString().Invoke(nameof(string.TrimStart), Literal('\uFEFF')).As(); + var valueExpression = GetPlainTextValueConversion(responseBodyType, content); + + return + [ + Declare("value", responseBodyType, valueExpression, out var value), + Return(result.FromValue(value, response)) + ]; + } + var isSpecialCaseType = responseBodyType.Equals(typeof(BinaryData)) || responseBodyType.IsReadOnlyMemory || responseBodyType.IsList @@ -913,7 +931,76 @@ private ValueExpression GetResultConversion(ClientResponseApi result, HttpRespon } private bool IsPlainTextResponse(CSharpType responseBodyType) - => responseBodyType.Equals(typeof(string)) && ServiceMethod.Operation.Responses.Any(r => r.IsErrorResponse is false && r.ContentTypes.Contains("text/plain")); + => responseBodyType.Equals(typeof(string)) && HasPlainTextContentType(); + + /// + /// Whether has a text/plain content type and is a type this generator + /// knows how to parse directly from the raw response text, without treating it as JSON. + /// + private bool IsPlainTextConversion(CSharpType responseBodyType) + => HasPlainTextContentType() && IsSupportedPlainTextType(responseBodyType); + + private bool HasPlainTextContentType() + => ServiceMethod.Operation.Responses.Any(r => r.IsErrorResponse is false && r.ContentTypes.Contains("text/plain")); + + private static bool IsSupportedPlainTextType(CSharpType type) + { + var nonNullableType = type.WithNullable(false); + if (nonNullableType.IsEnum) + { + return IsSupportedPlainTextType(nonNullableType.UnderlyingEnumType!); + } + + if (!nonNullableType.IsFrameworkType) + { + return false; + } + + var frameworkType = nonNullableType.FrameworkType; + return frameworkType == typeof(string) + || frameworkType == typeof(bool) + || frameworkType == typeof(byte) + || frameworkType == typeof(sbyte) + || frameworkType == typeof(short) + || frameworkType == typeof(ushort) + || frameworkType == typeof(int) + || frameworkType == typeof(uint) + || frameworkType == typeof(long) + || frameworkType == typeof(ulong) + || frameworkType == typeof(float) + || frameworkType == typeof(double) + || frameworkType == typeof(decimal) + || frameworkType == typeof(Guid) + || frameworkType == typeof(Uri) + || frameworkType == typeof(TimeSpan) + || frameworkType == typeof(DateTimeOffset); + } + + /// + /// Builds an expression that parses (the raw text/plain response body) into + /// , without relying on JSON parsing or reflection-based conversion. + /// + private ValueExpression GetPlainTextValueConversion(CSharpType valueType, ValueExpression content) + { + var nonNullableType = valueType.WithNullable(false); + if (nonNullableType.IsEnum) + { + return nonNullableType.ToEnum(GetPlainTextValueConversion(nonNullableType.UnderlyingEnumType!, content)); + } + + var invariantCulture = new MemberExpression(typeof(CultureInfo), nameof(CultureInfo.InvariantCulture)); + var frameworkType = nonNullableType.FrameworkType; + return frameworkType switch + { + Type t when t == typeof(string) => content, + Type t when t == typeof(bool) => Static().Invoke(nameof(bool.Parse), content).As(), + Type t when t == typeof(Guid) => Static().Invoke(nameof(Guid.Parse), content).As(), + Type t when t == typeof(Uri) => New.Instance(typeof(Uri), content), + Type t when t == typeof(TimeSpan) => content.As().ParseTimeSpan(Literal(SerializationFormat.Duration_Constant.ToFormatSpecifier()!)), + Type t when t == typeof(DateTimeOffset) => content.As().ParseDateTimeOffset(Literal("O")), + _ => Static(frameworkType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(frameworkType) + }; + } private static bool ShouldBuildStackVarForFrameworkType(CSharpType type) { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs index 99f08608b3d..6b746eef4c1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs @@ -1669,6 +1669,59 @@ public void PlainTextReturnTypeMethods() Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); } + [TestCase(typeof(int))] + [TestCase(typeof(bool))] + [TestCase(typeof(TimeSpan))] + public void PlainTextScalarReturnTypeMethods(Type type) + { + InputType inputType = type switch + { + { } t when t == typeof(int) => InputPrimitiveType.Int32, + { } t when t == typeof(bool) => InputPrimitiveType.Boolean, + { } t when t == typeof(TimeSpan) => InputPrimitiveType.PlainTime, + _ => throw new NotSupportedException() + }; + + var operation = InputFactory.Operation("GetPlainTextScalar", responses: + [InputFactory.OperationResponse([200], inputType, contentTypes: ["text/plain"])]); + var serviceMethod = InputFactory.BasicServiceMethod("GetPlainTextScalar", operation); + var inputClient = InputFactory.Client("TestClient", methods: [serviceMethod]); + + MockHelpers.LoadMockGenerator(); + var client = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(inputClient); + var method = new ScmMethodProviderCollection(serviceMethod, client!) + .Single(m => m.Kind == ScmMethodKind.Convenience && m.Signature.Name == "GetPlainTextScalar"); + + using var writer = new CodeWriter(); + writer.WriteMethod(method); + Assert.AreEqual(Helpers.GetExpectedFromFile(type.Name), writer.ToString(false)); + } + + [TestCase(true, true)] + [TestCase(true, false)] + [TestCase(false, true)] + [TestCase(false, false)] + public void PlainTextEnumReturnTypeMethods(bool isString, bool isExtensible) + { + InputType inputType = isString + ? InputFactory.StringEnum("TestEnum", [("Value", "value")], isExtensible: isExtensible) + : InputFactory.Int32Enum("TestEnum", [("Value", 1)], isExtensible: isExtensible); + + var operation = InputFactory.Operation("GetPlainTextEnum", responses: + [InputFactory.OperationResponse([200], inputType, contentTypes: ["text/plain"])]); + var serviceMethod = InputFactory.BasicServiceMethod("GetPlainTextEnum", operation); + var inputClient = InputFactory.Client("TestClient", methods: [serviceMethod]); + + MockHelpers.LoadMockGenerator(); + var client = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(inputClient); + var method = new ScmMethodProviderCollection(serviceMethod, client!) + .Single(m => m.Kind == ScmMethodKind.Convenience && m.Signature.Name == "GetPlainTextEnum"); + + using var writer = new CodeWriter(); + writer.WriteMethod(method); + Assert.AreEqual(Helpers.GetExpectedFromFile($"{isString},{isExtensible}"), writer.ToString(false)); + } + [Test] public void TestUnionResponseType() { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False).cs new file mode 100644 index 00000000000..bcabff11c16 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); + global::Sample.Models.TestEnum value = int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture).ToTestEnum(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True).cs new file mode 100644 index 00000000000..0666d6f51d8 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); + global::Sample.Models.TestEnum value = new global::Sample.Models.TestEnum(int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture)); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False).cs new file mode 100644 index 00000000000..f360b4939f1 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); + global::Sample.Models.TestEnum value = result.GetRawResponse().Content.ToString().TrimStart('').ToTestEnum(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True).cs new file mode 100644 index 00000000000..6fa4400555e --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); + global::Sample.Models.TestEnum value = new global::Sample.Models.TestEnum(result.GetRawResponse().Content.ToString().TrimStart('')); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Boolean).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Boolean).cs new file mode 100644 index 00000000000..f2f666c704a --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Boolean).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + bool value = bool.Parse(result.GetRawResponse().Content.ToString().TrimStart('')); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32).cs new file mode 100644 index 00000000000..e320659eb5b --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + int value = int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpan).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpan).cs new file mode 100644 index 00000000000..fb368f8ef33 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpan).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + global::System.TimeSpan value = global::Sample.TypeFormatters.ParseTimeSpan(result.GetRawResponse().Content.ToString().TrimStart(''), "c"); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs index e07267199cf..2e58189ccf3 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs @@ -24,7 +24,7 @@ public class ExtensibleEnumTests [TestCase(true, true)] public async Task EnumResponseDeserialization(bool hasBom, bool isAsync) { - var content = BinaryData.FromString((hasBom ? "\uFEFF" : "") + "\"Monday\""); + var content = BinaryData.FromString((hasBom ? "\uFEFF" : "") + "Monday"); var response = new Mock(); response.SetupGet(r => r.Content).Returns(content); var protocolResult = ClientResult.FromResponse(response.Object); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs index 54818f20ae8..58eac4ed6dd 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs @@ -10,10 +10,8 @@ using System.ClientModel.Primitives; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.IO; using System.Linq; using System.Net.ServerSentEvents; -using System.Text.Json; using System.Threading; using System.Threading.Tasks; using SampleTypeSpec.Models.Custom; @@ -1088,9 +1086,8 @@ public virtual async Task GetUnknownValueAsync(RequestOptions opti public virtual ClientResult GetUnknownValue(CancellationToken cancellationToken = default) { ClientResult result = GetUnknownValue(cancellationToken.ToRequestOptions()); - using Stream stream = result.GetRawResponse().Content.ToStream(); - using JsonDocument document = JsonDocument.Parse(stream); - return ClientResult.FromValue(new DaysOfWeekExtensibleEnum(document.RootElement.GetString()), result.GetRawResponse()); + DaysOfWeekExtensibleEnum value = new DaysOfWeekExtensibleEnum(result.GetRawResponse().Content.ToString().TrimStart('')); + return ClientResult.FromValue(value, result.GetRawResponse()); } /// get extensible enum. @@ -1099,9 +1096,8 @@ public virtual ClientResult GetUnknownValue(Cancellati public virtual async Task> GetUnknownValueAsync(CancellationToken cancellationToken = default) { ClientResult result = await GetUnknownValueAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); - using Stream stream = result.GetRawResponse().Content.ToStream(); - using JsonDocument document = JsonDocument.Parse(stream); - return ClientResult.FromValue(new DaysOfWeekExtensibleEnum(document.RootElement.GetString()), result.GetRawResponse()); + DaysOfWeekExtensibleEnum value = new DaysOfWeekExtensibleEnum(result.GetRawResponse().Content.ToString().TrimStart('')); + return ClientResult.FromValue(value, result.GetRawResponse()); } /// From bba90fc4868ea9e128dc80ff8bfdf0e851228f76 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 20:15:24 +0000 Subject: [PATCH 08/21] Add nullable enum test coverage for remaining isString/isExtensible combinations Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../test/Providers/ScmMethodProviderCollectionTests.cs | 2 ++ .../EnumReturnTypeMethods(False,True,True).cs | 8 ++++++++ .../EnumReturnTypeMethods(True,False,True).cs | 8 ++++++++ 3 files changed, 18 insertions(+) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,True).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,True).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs index 6b746eef4c1..66d6a3c64e2 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs @@ -1626,6 +1626,8 @@ public void ScalarReturnTypeMethods(Type type, bool isAsync = false) [TestCase(false, true, false)] [TestCase(false, false, false)] [TestCase(true, true, true)] + [TestCase(true, false, true)] + [TestCase(false, true, true)] [TestCase(false, false, true)] public void EnumReturnTypeMethods(bool isString, bool isExtensible, bool isNullable) { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,True).cs new file mode 100644 index 00000000000..940c12a3f7d --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(False,True,True).cs @@ -0,0 +1,8 @@ +public virtual global::System.ClientModel.ClientResult GetEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + global::Sample.Models.TestEnum? value = (document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(document.RootElement.GetInt32()); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,True).cs new file mode 100644 index 00000000000..0072803b03f --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/EnumReturnTypeMethods(True,False,True).cs @@ -0,0 +1,8 @@ +public virtual global::System.ClientModel.ClientResult GetEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetEnum(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + global::Sample.Models.TestEnum? value = (document.RootElement.ValueKind == global::System.Text.Json.JsonValueKind.Null) ? ((global::Sample.Models.TestEnum?)null) : document.RootElement.GetString().ToTestEnum(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} From 0e496fefe20223eecad74a86bf4e6c9d464a3a85 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 20:34:31 +0000 Subject: [PATCH 09/21] Simplify plain-text response checks, avoid null-forgiving, fix mixed content-type detection Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 60 +++++++++++-------- .../ScmMethodProviderCollectionTests.cs | 20 +++++++ ...entTypeScalarResponseUsesJsonConversion.cs | 8 +++ 3 files changed, 63 insertions(+), 25 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/MixedContentTypeScalarResponseUsesJsonConversion.cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index 4bf7c8cb1b0..1d10ca5d91b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -875,9 +875,7 @@ private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi re } var isSpecialCaseType = responseBodyType.Equals(typeof(BinaryData)) - || responseBodyType.IsReadOnlyMemory - || responseBodyType.IsList - || responseBodyType.IsDictionary + || responseBodyType.IsCollection || IsPlainTextResponse(responseBodyType); if (!isSpecialCaseType && (responseBodyType.IsFrameworkType || responseBodyType.IsEnum)) @@ -941,14 +939,20 @@ private bool IsPlainTextConversion(CSharpType responseBodyType) => HasPlainTextContentType() && IsSupportedPlainTextType(responseBodyType); private bool HasPlainTextContentType() - => ServiceMethod.Operation.Responses.Any(r => r.IsErrorResponse is false && r.ContentTypes.Contains("text/plain")); + { + var contentTypes = ServiceMethod.Operation.Responses + .Where(r => r.IsErrorResponse is false) + .SelectMany(r => r.ContentTypes) + .ToList(); + return contentTypes.Count > 0 && contentTypes.All(ct => ct == "text/plain"); + } private static bool IsSupportedPlainTextType(CSharpType type) { var nonNullableType = type.WithNullable(false); if (nonNullableType.IsEnum) { - return IsSupportedPlainTextType(nonNullableType.UnderlyingEnumType!); + return IsSupportedPlainTextType(nonNullableType.UnderlyingEnumType); } if (!nonNullableType.IsFrameworkType) @@ -956,24 +960,27 @@ private static bool IsSupportedPlainTextType(CSharpType type) return false; } - var frameworkType = nonNullableType.FrameworkType; - return frameworkType == typeof(string) - || frameworkType == typeof(bool) - || frameworkType == typeof(byte) - || frameworkType == typeof(sbyte) - || frameworkType == typeof(short) - || frameworkType == typeof(ushort) - || frameworkType == typeof(int) - || frameworkType == typeof(uint) - || frameworkType == typeof(long) - || frameworkType == typeof(ulong) - || frameworkType == typeof(float) - || frameworkType == typeof(double) - || frameworkType == typeof(decimal) - || frameworkType == typeof(Guid) - || frameworkType == typeof(Uri) - || frameworkType == typeof(TimeSpan) - || frameworkType == typeof(DateTimeOffset); + return nonNullableType.FrameworkType switch + { + Type t when t == typeof(string) => true, + Type t when t == typeof(bool) => true, + Type t when t == typeof(byte) => true, + Type t when t == typeof(sbyte) => true, + Type t when t == typeof(short) => true, + Type t when t == typeof(ushort) => true, + Type t when t == typeof(int) => true, + Type t when t == typeof(uint) => true, + Type t when t == typeof(long) => true, + Type t when t == typeof(ulong) => true, + Type t when t == typeof(float) => true, + Type t when t == typeof(double) => true, + Type t when t == typeof(decimal) => true, + Type t when t == typeof(Guid) => true, + Type t when t == typeof(Uri) => true, + Type t when t == typeof(TimeSpan) => true, + Type t when t == typeof(DateTimeOffset) => true, + _ => false + }; } /// @@ -985,7 +992,7 @@ private ValueExpression GetPlainTextValueConversion(CSharpType valueType, ValueE var nonNullableType = valueType.WithNullable(false); if (nonNullableType.IsEnum) { - return nonNullableType.ToEnum(GetPlainTextValueConversion(nonNullableType.UnderlyingEnumType!, content)); + return nonNullableType.ToEnum(GetPlainTextValueConversion(nonNullableType.UnderlyingEnumType, content)); } var invariantCulture = new MemberExpression(typeof(CultureInfo), nameof(CultureInfo.InvariantCulture)); @@ -997,7 +1004,10 @@ private ValueExpression GetPlainTextValueConversion(CSharpType valueType, ValueE Type t when t == typeof(Guid) => Static().Invoke(nameof(Guid.Parse), content).As(), Type t when t == typeof(Uri) => New.Instance(typeof(Uri), content), Type t when t == typeof(TimeSpan) => content.As().ParseTimeSpan(Literal(SerializationFormat.Duration_Constant.ToFormatSpecifier()!)), - Type t when t == typeof(DateTimeOffset) => content.As().ParseDateTimeOffset(Literal("O")), + // "U" is reserved by TypeFormattersDefinition.ParseDateTimeOffset for Unix-time parsing; any other + // specifier (including this one) falls through to standard invariant-culture DateTimeOffset parsing, + // matching the default (non-Unix) format used by the JSON deserialization path. + Type t when t == typeof(DateTimeOffset) => content.As().ParseDateTimeOffset(Literal(SerializationFormat.DateTime_ISO8601.ToFormatSpecifier()!)), _ => Static(frameworkType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(frameworkType) }; } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs index 66d6a3c64e2..f6a0ceb56ba 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs @@ -1724,6 +1724,26 @@ public void PlainTextEnumReturnTypeMethods(bool isString, bool isExtensible) Assert.AreEqual(Helpers.GetExpectedFromFile($"{isString},{isExtensible}"), writer.ToString(false)); } + [Test] + public void MixedContentTypeScalarResponseUsesJsonConversion() + { + // When a response declares text/plain alongside another content type (e.g. application/json), the + // wire format cannot be assumed to be raw text, so the JSON conversion path must be used instead. + var operation = InputFactory.Operation("GetScalar", responses: + [InputFactory.OperationResponse([200], InputPrimitiveType.Int32, contentTypes: ["application/json", "text/plain"])]); + var serviceMethod = InputFactory.BasicServiceMethod("GetScalar", operation); + var inputClient = InputFactory.Client("TestClient", methods: [serviceMethod]); + + MockHelpers.LoadMockGenerator(); + var client = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(inputClient); + var method = new ScmMethodProviderCollection(serviceMethod, client!) + .Single(m => m.Kind == ScmMethodKind.Convenience && m.Signature.Name == "GetScalar"); + + using var writer = new CodeWriter(); + writer.WriteMethod(method); + Assert.AreEqual(Helpers.GetExpectedFromFile(), writer.ToString(false)); + } + [Test] public void TestUnionResponseType() { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/MixedContentTypeScalarResponseUsesJsonConversion.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/MixedContentTypeScalarResponseUsesJsonConversion.cs new file mode 100644 index 00000000000..88d44fbf0e4 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/MixedContentTypeScalarResponseUsesJsonConversion.cs @@ -0,0 +1,8 @@ +public virtual global::System.ClientModel.ClientResult GetScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetScalar(cancellationToken.ToRequestOptions()); + using global::System.IO.Stream stream = result.GetRawResponse().Content.ToStream(); + using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stream); + int value = document.RootElement.GetInt32(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} From c6bbcbe03b731dda4b1c93d235cadfdd057db61f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 20:43:04 +0000 Subject: [PATCH 10/21] fix(http-client-csharp): refine plain text response conversion Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 85 +++++++++++-------- .../ScmMethodProviderCollectionTests.cs | 35 ++++++-- ...umReturnTypeMethods(False,False,False).cs} | 0 ...EnumReturnTypeMethods(False,False,True).cs | 6 ++ ...numReturnTypeMethods(False,True,False).cs} | 0 ...tEnumReturnTypeMethods(False,True,True).cs | 6 ++ ...numReturnTypeMethods(True,False,False).cs} | 0 ...tEnumReturnTypeMethods(True,False,True).cs | 6 ++ ...EnumReturnTypeMethods(True,True,False).cs} | 0 ...xtEnumReturnTypeMethods(True,True,True).cs | 6 ++ ...calarReturnTypeMethods(BooleanNullable).cs | 6 ++ ...ScalarReturnTypeMethods(DateTimeOffset).cs | 6 ++ ...tScalarReturnTypeMethods(Int32Nullable).cs | 6 ++ ...alarReturnTypeMethods(TimeSpanNullable).cs | 6 ++ 14 files changed, 124 insertions(+), 44 deletions(-) rename packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/{PlainTextEnumReturnTypeMethods(False,False).cs => PlainTextEnumReturnTypeMethods(False,False,False).cs} (100%) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,True).cs rename packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/{PlainTextEnumReturnTypeMethods(False,True).cs => PlainTextEnumReturnTypeMethods(False,True,False).cs} (100%) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,True).cs rename packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/{PlainTextEnumReturnTypeMethods(True,False).cs => PlainTextEnumReturnTypeMethods(True,False,False).cs} (100%) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,True).cs rename packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/{PlainTextEnumReturnTypeMethods(True,True).cs => PlainTextEnumReturnTypeMethods(True,True,False).cs} (100%) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,True).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(BooleanNullable).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(DateTimeOffset).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32Nullable).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpanNullable).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index 4bf7c8cb1b0..6d70ac5b146 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -865,7 +865,10 @@ private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi re if (IsPlainTextConversion(responseBodyType) && !responseBodyType.Equals(typeof(string))) { var content = response.Content().InvokeToString().Invoke(nameof(string.TrimStart), Literal('\uFEFF')).As(); - var valueExpression = GetPlainTextValueConversion(responseBodyType, content); + var deserializedValue = GetPlainTextValueConversion(responseBodyType, content); + var valueExpression = responseBodyType.IsNullable + ? new TernaryConditionalExpression(content.Equal(Literal("null")), Null.CastTo(responseBodyType), deserializedValue) + : deserializedValue; return [ @@ -876,8 +879,7 @@ private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi re var isSpecialCaseType = responseBodyType.Equals(typeof(BinaryData)) || responseBodyType.IsReadOnlyMemory - || responseBodyType.IsList - || responseBodyType.IsDictionary + || responseBodyType.IsCollection || IsPlainTextResponse(responseBodyType); if (!isSpecialCaseType && (responseBodyType.IsFrameworkType || responseBodyType.IsEnum)) @@ -941,39 +943,41 @@ private bool IsPlainTextConversion(CSharpType responseBodyType) => HasPlainTextContentType() && IsSupportedPlainTextType(responseBodyType); private bool HasPlainTextContentType() - => ServiceMethod.Operation.Responses.Any(r => r.IsErrorResponse is false && r.ContentTypes.Contains("text/plain")); + { + var responses = ServiceMethod.Operation.Responses.Where(r => r.IsErrorResponse is false); + return responses.Any() && responses.All(r => r.ContentTypes.Count == 1 && r.ContentTypes[0] == "text/plain"); + } private static bool IsSupportedPlainTextType(CSharpType type) { var nonNullableType = type.WithNullable(false); - if (nonNullableType.IsEnum) - { - return IsSupportedPlainTextType(nonNullableType.UnderlyingEnumType!); - } - - if (!nonNullableType.IsFrameworkType) - { - return false; - } - - var frameworkType = nonNullableType.FrameworkType; - return frameworkType == typeof(string) - || frameworkType == typeof(bool) - || frameworkType == typeof(byte) - || frameworkType == typeof(sbyte) - || frameworkType == typeof(short) - || frameworkType == typeof(ushort) - || frameworkType == typeof(int) - || frameworkType == typeof(uint) - || frameworkType == typeof(long) - || frameworkType == typeof(ulong) - || frameworkType == typeof(float) - || frameworkType == typeof(double) - || frameworkType == typeof(decimal) - || frameworkType == typeof(Guid) - || frameworkType == typeof(Uri) - || frameworkType == typeof(TimeSpan) - || frameworkType == typeof(DateTimeOffset); + if (nonNullableType is { IsEnum: true, UnderlyingEnumType: { } underlyingEnumType }) + { + return IsSupportedPlainTextType(underlyingEnumType); + } + + return nonNullableType.FrameworkType switch + { + Type t when nonNullableType.IsFrameworkType + && (t == typeof(string) + || t == typeof(bool) + || t == typeof(byte) + || t == typeof(sbyte) + || t == typeof(short) + || t == typeof(ushort) + || t == typeof(int) + || t == typeof(uint) + || t == typeof(long) + || t == typeof(ulong) + || t == typeof(float) + || t == typeof(double) + || t == typeof(decimal) + || t == typeof(Guid) + || t == typeof(Uri) + || t == typeof(TimeSpan) + || t == typeof(DateTimeOffset)) => true, + _ => false + }; } /// @@ -983,9 +987,9 @@ private static bool IsSupportedPlainTextType(CSharpType type) private ValueExpression GetPlainTextValueConversion(CSharpType valueType, ValueExpression content) { var nonNullableType = valueType.WithNullable(false); - if (nonNullableType.IsEnum) + if (nonNullableType is { IsEnum: true, UnderlyingEnumType: { } underlyingEnumType }) { - return nonNullableType.ToEnum(GetPlainTextValueConversion(nonNullableType.UnderlyingEnumType!, content)); + return nonNullableType.ToEnum(GetPlainTextValueConversion(underlyingEnumType, content)); } var invariantCulture = new MemberExpression(typeof(CultureInfo), nameof(CultureInfo.InvariantCulture)); @@ -996,12 +1000,21 @@ private ValueExpression GetPlainTextValueConversion(CSharpType valueType, ValueE Type t when t == typeof(bool) => Static().Invoke(nameof(bool.Parse), content).As(), Type t when t == typeof(Guid) => Static().Invoke(nameof(Guid.Parse), content).As(), Type t when t == typeof(Uri) => New.Instance(typeof(Uri), content), - Type t when t == typeof(TimeSpan) => content.As().ParseTimeSpan(Literal(SerializationFormat.Duration_Constant.ToFormatSpecifier()!)), - Type t when t == typeof(DateTimeOffset) => content.As().ParseDateTimeOffset(Literal("O")), + Type t when t == typeof(TimeSpan) => content.As().ParseTimeSpan(Literal(SerializationFormat.Duration_Constant.ToFormatSpecifier() ?? throw new InvalidOperationException())), + Type t when t == typeof(DateTimeOffset) => content.As().ParseDateTimeOffset(Literal(GetResponseSerializationFormat().ToFormatSpecifier())), _ => Static(frameworkType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(frameworkType) }; } + private SerializationFormat GetResponseSerializationFormat() + { + var responseBodyType = ServiceMethod.Operation.Responses + .FirstOrDefault(r => r.IsErrorResponse is false)?.BodyType; + return responseBodyType is null + ? SerializationFormat.Default + : ScmCodeModelGenerator.Instance.TypeFactory.GetSerializationFormat(responseBodyType); + } + private static bool ShouldBuildStackVarForFrameworkType(CSharpType type) { if (!type.IsFrameworkType) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs index 66d6a3c64e2..3fcbce42fc5 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs @@ -1672,17 +1672,27 @@ public void PlainTextReturnTypeMethods() } [TestCase(typeof(int))] + [TestCase(typeof(int?))] [TestCase(typeof(bool))] + [TestCase(typeof(bool?))] [TestCase(typeof(TimeSpan))] + [TestCase(typeof(TimeSpan?))] + [TestCase(typeof(DateTimeOffset))] public void PlainTextScalarReturnTypeMethods(Type type) { - InputType inputType = type switch + var underlyingType = Nullable.GetUnderlyingType(type); + InputType inputType = (underlyingType ?? type) switch { { } t when t == typeof(int) => InputPrimitiveType.Int32, { } t when t == typeof(bool) => InputPrimitiveType.Boolean, { } t when t == typeof(TimeSpan) => InputPrimitiveType.PlainTime, + { } t when t == typeof(DateTimeOffset) => InputPrimitiveType.PlainDate, _ => throw new NotSupportedException() }; + if (underlyingType != null) + { + inputType = new InputNullableType(inputType); + } var operation = InputFactory.Operation("GetPlainTextScalar", responses: [InputFactory.OperationResponse([200], inputType, contentTypes: ["text/plain"])]); @@ -1696,18 +1706,27 @@ public void PlainTextScalarReturnTypeMethods(Type type) using var writer = new CodeWriter(); writer.WriteMethod(method); - Assert.AreEqual(Helpers.GetExpectedFromFile(type.Name), writer.ToString(false)); + var baselineName = underlyingType != null ? $"{underlyingType.Name}Nullable" : type.Name; + Assert.AreEqual(Helpers.GetExpectedFromFile(baselineName), writer.ToString(false)); } - [TestCase(true, true)] - [TestCase(true, false)] - [TestCase(false, true)] - [TestCase(false, false)] - public void PlainTextEnumReturnTypeMethods(bool isString, bool isExtensible) + [TestCase(true, true, false)] + [TestCase(true, false, false)] + [TestCase(false, true, false)] + [TestCase(false, false, false)] + [TestCase(true, true, true)] + [TestCase(true, false, true)] + [TestCase(false, true, true)] + [TestCase(false, false, true)] + public void PlainTextEnumReturnTypeMethods(bool isString, bool isExtensible, bool isNullable) { InputType inputType = isString ? InputFactory.StringEnum("TestEnum", [("Value", "value")], isExtensible: isExtensible) : InputFactory.Int32Enum("TestEnum", [("Value", 1)], isExtensible: isExtensible); + if (isNullable) + { + inputType = new InputNullableType(inputType); + } var operation = InputFactory.Operation("GetPlainTextEnum", responses: [InputFactory.OperationResponse([200], inputType, contentTypes: ["text/plain"])]); @@ -1721,7 +1740,7 @@ public void PlainTextEnumReturnTypeMethods(bool isString, bool isExtensible) using var writer = new CodeWriter(); writer.WriteMethod(method); - Assert.AreEqual(Helpers.GetExpectedFromFile($"{isString},{isExtensible}"), writer.ToString(false)); + Assert.AreEqual(Helpers.GetExpectedFromFile($"{isString},{isExtensible},{isNullable}"), writer.ToString(false)); } [Test] diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,False).cs similarity index 100% rename from packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False).cs rename to packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,False).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,True).cs new file mode 100644 index 00000000000..f105807bcc3 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,True).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); + global::Sample.Models.TestEnum? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::Sample.Models.TestEnum?)null) : int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture).ToTestEnum(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,False).cs similarity index 100% rename from packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True).cs rename to packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,False).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,True).cs new file mode 100644 index 00000000000..39faab9a647 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,True).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); + global::Sample.Models.TestEnum? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture)); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,False).cs similarity index 100% rename from packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False).cs rename to packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,False).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,True).cs new file mode 100644 index 00000000000..3724b0d34db --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,True).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); + global::Sample.Models.TestEnum? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::Sample.Models.TestEnum?)null) : result.GetRawResponse().Content.ToString().TrimStart('').ToTestEnum(); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,False).cs similarity index 100% rename from packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True).cs rename to packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,False).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,True).cs new file mode 100644 index 00000000000..dd584b67d9a --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,True).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); + global::Sample.Models.TestEnum? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(result.GetRawResponse().Content.ToString().TrimStart('')); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(BooleanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(BooleanNullable).cs new file mode 100644 index 00000000000..2f89f35b043 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(BooleanNullable).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + bool? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((bool?)null) : bool.Parse(result.GetRawResponse().Content.ToString().TrimStart('')); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(DateTimeOffset).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(DateTimeOffset).cs new file mode 100644 index 00000000000..4ca6d99cb2a --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(DateTimeOffset).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + global::System.DateTimeOffset value = global::Sample.TypeFormatters.ParseDateTimeOffset(result.GetRawResponse().Content.ToString().TrimStart(''), "D"); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32Nullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32Nullable).cs new file mode 100644 index 00000000000..8ec8038a396 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32Nullable).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + int? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((int?)null) : int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpanNullable).cs new file mode 100644 index 00000000000..9229cc2065f --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpanNullable).cs @@ -0,0 +1,6 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + global::System.TimeSpan? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::System.TimeSpan?)null) : global::Sample.TypeFormatters.ParseTimeSpan(result.GetRawResponse().Content.ToString().TrimStart(''), "c"); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} From d9df7e9b69a6f7321517bd98f1150f0dfd528e61 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 20:54:09 +0000 Subject: [PATCH 11/21] refactor(http-client-csharp): consolidate plain text response helpers Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 126 ++++++++---------- 1 file changed, 53 insertions(+), 73 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index 85ac9fd2500..2265dc0e3e8 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -640,7 +640,7 @@ private IEnumerable GetStackVariablesForReturnValueConversi if (IsConvertibleFromBinaryData(responseBodyType) && (responseBodyType.IsFrameworkType || responseBodyType.IsEnum) && !responseBodyType.Equals(typeof(BinaryData)) - && !IsPlainTextConversion(responseBodyType)) + && GetPlainTextValueConversion(responseBodyType, result.GetRawResponse()) is null) { var data = result.GetRawResponse().Content(); // The stream overload preserves UTF-8 BOM handling from ToObjectFromJson. @@ -859,27 +859,18 @@ private MethodBodyStatement AddElement(ValueExpression? dictKey, ValueExpression private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi result, HttpResponseApi response, CSharpType responseBodyType, Dictionary declarations) { - // Operations that return a non-string primitive or enum with a text/plain content type are not JSON-encoded, - // so the value must be parsed from the raw response text instead of going through JsonDocument. A leading - // UTF-8 BOM is stripped first to match the tolerance previously provided by JsonDocument/ToObjectFromJson. - if (IsPlainTextConversion(responseBodyType) && !responseBodyType.Equals(typeof(string))) + if (!responseBodyType.Equals(typeof(string)) && GetPlainTextValueConversion(responseBodyType, response) is { } plainTextValue) { - var content = response.Content().InvokeToString().Invoke(nameof(string.TrimStart), Literal('\uFEFF')).As(); - var deserializedValue = GetPlainTextValueConversion(responseBodyType, content); - var valueExpression = responseBodyType.IsNullable - ? new TernaryConditionalExpression(content.Equal(Literal("null")), Null.CastTo(responseBodyType), deserializedValue) - : deserializedValue; - return [ - Declare("value", responseBodyType, valueExpression, out var value), + Declare("value", responseBodyType, plainTextValue, out var value), Return(result.FromValue(value, response)) ]; } var isSpecialCaseType = responseBodyType.Equals(typeof(BinaryData)) || responseBodyType.IsCollection - || IsPlainTextResponse(responseBodyType); + || (responseBodyType.Equals(typeof(string)) && HasOnlyPlainTextContentType()); if (!isSpecialCaseType && (responseBodyType.IsFrameworkType || responseBodyType.IsEnum)) { @@ -924,88 +915,77 @@ private ValueExpression GetResultConversion(ClientResponseApi result, HttpRespon { return declarations["value"].CastTo(new CSharpType(responseBodyType.OutputType.FrameworkType, responseBodyType.Arguments[0], responseBodyType.Arguments[1])); } - if (IsPlainTextResponse(responseBodyType)) + if (responseBodyType.Equals(typeof(string)) && HasOnlyPlainTextContentType()) { return response.Content().InvokeToString(); } return result.CastTo(responseBodyType); } - private bool IsPlainTextResponse(CSharpType responseBodyType) - => responseBodyType.Equals(typeof(string)) && HasPlainTextContentType(); - - /// - /// Whether has a text/plain content type and is a type this generator - /// knows how to parse directly from the raw response text, without treating it as JSON. - /// - private bool IsPlainTextConversion(CSharpType responseBodyType) - => HasPlainTextContentType() && IsSupportedPlainTextType(responseBodyType); - - private bool HasPlainTextContentType() - { - var contentTypes = ServiceMethod.Operation.Responses - .Where(r => r.IsErrorResponse is false) - .SelectMany(r => r.ContentTypes); - return contentTypes.Any() && contentTypes.All(contentType => contentType == "text/plain"); - } - - private static bool IsSupportedPlainTextType(CSharpType type) + private ValueExpression? GetPlainTextValueConversion(CSharpType responseBodyType, HttpResponseApi response) { - var nonNullableType = type.WithNullable(false); - if (nonNullableType is { IsEnum: true, UnderlyingEnumType: { } underlyingEnumType }) + if (!HasOnlyPlainTextContentType()) { - return IsSupportedPlainTextType(underlyingEnumType); - } - - return nonNullableType.FrameworkType switch - { - Type t when nonNullableType.IsFrameworkType - && (t == typeof(string) - || t == typeof(bool) - || t == typeof(byte) - || t == typeof(sbyte) - || t == typeof(short) - || t == typeof(ushort) - || t == typeof(int) - || t == typeof(uint) - || t == typeof(long) - || t == typeof(ulong) - || t == typeof(float) - || t == typeof(double) - || t == typeof(decimal) - || t == typeof(Guid) - || t == typeof(Uri) - || t == typeof(TimeSpan) - || t == typeof(DateTimeOffset)) => true, - _ => false - }; - } + return null; + } - /// - /// Builds an expression that parses (the raw text/plain response body) into - /// , without relying on JSON parsing or reflection-based conversion. - /// - private ValueExpression GetPlainTextValueConversion(CSharpType valueType, ValueExpression content) - { - var nonNullableType = valueType.WithNullable(false); + // Primitive and enum text/plain bodies are not JSON-encoded. Strip a leading UTF-8 BOM to preserve + // the tolerance previously provided by JsonDocument/ToObjectFromJson. + var content = response.Content().InvokeToString().Invoke(nameof(string.TrimStart), Literal('\uFEFF')).As(); + var nonNullableType = responseBodyType.WithNullable(false); + var typeToDeserialize = nonNullableType; + CSharpType? enumType = null; if (nonNullableType is { IsEnum: true, UnderlyingEnumType: { } underlyingEnumType }) { - return nonNullableType.ToEnum(GetPlainTextValueConversion(underlyingEnumType, content)); + enumType = nonNullableType; + typeToDeserialize = underlyingEnumType; } var invariantCulture = new MemberExpression(typeof(CultureInfo), nameof(CultureInfo.InvariantCulture)); - var frameworkType = nonNullableType.FrameworkType; - return frameworkType switch + ValueExpression? deserializedValue = typeToDeserialize.FrameworkType switch { Type t when t == typeof(string) => content, Type t when t == typeof(bool) => Static().Invoke(nameof(bool.Parse), content).As(), Type t when t == typeof(Guid) => Static().Invoke(nameof(Guid.Parse), content).As(), Type t when t == typeof(Uri) => New.Instance(typeof(Uri), content), Type t when t == typeof(TimeSpan) => content.As().ParseTimeSpan(Literal(SerializationFormat.Duration_Constant.ToFormatSpecifier() ?? throw new InvalidOperationException())), - Type t when t == typeof(TimeSpan) => content.As().ParseTimeSpan(Literal(SerializationFormat.Duration_Constant.ToFormatSpecifier() ?? throw new InvalidOperationException())), Type t when t == typeof(DateTimeOffset) => content.As().ParseDateTimeOffset(Literal(GetResponseSerializationFormat().ToFormatSpecifier())), - _ => Static(frameworkType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(frameworkType) + Type frameworkType when typeToDeserialize.IsFrameworkType + && (frameworkType == typeof(byte) + || frameworkType == typeof(sbyte) + || frameworkType == typeof(short) + || frameworkType == typeof(ushort) + || frameworkType == typeof(int) + || frameworkType == typeof(uint) + || frameworkType == typeof(long) + || frameworkType == typeof(ulong) + || frameworkType == typeof(float) + || frameworkType == typeof(double) + || frameworkType == typeof(decimal)) + => Static(frameworkType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(frameworkType), + _ => null }; + if (deserializedValue is null) + { + return null; + } + + if (enumType is not null) + { + deserializedValue = enumType.ToEnum(deserializedValue); + } + + return responseBodyType.IsNullable + ? new TernaryConditionalExpression(content.Equal(Literal("null")), Null.CastTo(responseBodyType), deserializedValue) + : deserializedValue; + } + + private bool HasOnlyPlainTextContentType() + { + var contentTypes = ServiceMethod.Operation.Responses + .Where(r => r.IsErrorResponse is false) + .SelectMany(r => r.ContentTypes); + return contentTypes.Any() && contentTypes.All(contentType => contentType == "text/plain"); } private SerializationFormat GetResponseSerializationFormat() From 755b311a29acdda88a0e3a9779d0ee74e772ebab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 21:08:38 +0000 Subject: [PATCH 12/21] perf(http-client-csharp): cache plain text response content Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 26 ++++++------------- ...numReturnTypeMethods(False,False,False).cs | 3 ++- ...EnumReturnTypeMethods(False,False,True).cs | 3 ++- ...EnumReturnTypeMethods(False,True,False).cs | 3 ++- ...tEnumReturnTypeMethods(False,True,True).cs | 3 ++- ...EnumReturnTypeMethods(True,False,False).cs | 3 ++- ...tEnumReturnTypeMethods(True,False,True).cs | 3 ++- ...tEnumReturnTypeMethods(True,True,False).cs | 3 ++- ...xtEnumReturnTypeMethods(True,True,True).cs | 3 ++- ...ainTextScalarReturnTypeMethods(Boolean).cs | 3 ++- ...calarReturnTypeMethods(BooleanNullable).cs | 3 ++- ...ScalarReturnTypeMethods(DateTimeOffset).cs | 3 ++- ...PlainTextScalarReturnTypeMethods(Int32).cs | 3 ++- ...tScalarReturnTypeMethods(Int32Nullable).cs | 3 ++- ...inTextScalarReturnTypeMethods(TimeSpan).cs | 3 ++- ...alarReturnTypeMethods(TimeSpanNullable).cs | 3 ++- 16 files changed, 38 insertions(+), 33 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index 2265dc0e3e8..88ab08c8ecd 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -640,7 +640,7 @@ private IEnumerable GetStackVariablesForReturnValueConversi if (IsConvertibleFromBinaryData(responseBodyType) && (responseBodyType.IsFrameworkType || responseBodyType.IsEnum) && !responseBodyType.Equals(typeof(BinaryData)) - && GetPlainTextValueConversion(responseBodyType, result.GetRawResponse()) is null) + && !HasOnlyPlainTextContentType()) { var data = result.GetRawResponse().Content(); // The stream overload preserves UTF-8 BOM handling from ToObjectFromJson. @@ -859,11 +859,13 @@ private MethodBodyStatement AddElement(ValueExpression? dictKey, ValueExpression private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi result, HttpResponseApi response, CSharpType responseBodyType, Dictionary declarations) { - if (!responseBodyType.Equals(typeof(string)) && GetPlainTextValueConversion(responseBodyType, response) is { } plainTextValue) + if (!responseBodyType.Equals(typeof(string)) && HasOnlyPlainTextContentType()) { + var contentExpression = response.Content().InvokeToString().Invoke(nameof(string.TrimStart), Literal('\uFEFF')).As(); return [ - Declare("value", responseBodyType, plainTextValue, out var value), + Declare("content", typeof(string), contentExpression, out var content), + Declare("value", responseBodyType, GetPlainTextValueConversion(responseBodyType, content), out var value), Return(result.FromValue(value, response)) ]; } @@ -922,16 +924,8 @@ private ValueExpression GetResultConversion(ClientResponseApi result, HttpRespon return result.CastTo(responseBodyType); } - private ValueExpression? GetPlainTextValueConversion(CSharpType responseBodyType, HttpResponseApi response) + private ValueExpression GetPlainTextValueConversion(CSharpType responseBodyType, ValueExpression content) { - if (!HasOnlyPlainTextContentType()) - { - return null; - } - - // Primitive and enum text/plain bodies are not JSON-encoded. Strip a leading UTF-8 BOM to preserve - // the tolerance previously provided by JsonDocument/ToObjectFromJson. - var content = response.Content().InvokeToString().Invoke(nameof(string.TrimStart), Literal('\uFEFF')).As(); var nonNullableType = responseBodyType.WithNullable(false); var typeToDeserialize = nonNullableType; CSharpType? enumType = null; @@ -942,7 +936,7 @@ private ValueExpression GetResultConversion(ClientResponseApi result, HttpRespon } var invariantCulture = new MemberExpression(typeof(CultureInfo), nameof(CultureInfo.InvariantCulture)); - ValueExpression? deserializedValue = typeToDeserialize.FrameworkType switch + var deserializedValue = typeToDeserialize.FrameworkType switch { Type t when t == typeof(string) => content, Type t when t == typeof(bool) => Static().Invoke(nameof(bool.Parse), content).As(), @@ -963,12 +957,8 @@ Type frameworkType when typeToDeserialize.IsFrameworkType || frameworkType == typeof(double) || frameworkType == typeof(decimal)) => Static(frameworkType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(frameworkType), - _ => null + _ => Static(typeToDeserialize.FrameworkType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(typeToDeserialize.FrameworkType) }; - if (deserializedValue is null) - { - return null; - } if (enumType is not null) { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,False).cs index bcabff11c16..e3de8f298ee 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,False).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); - global::Sample.Models.TestEnum value = int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture).ToTestEnum(); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::Sample.Models.TestEnum value = int.Parse(content, global::System.Globalization.CultureInfo.InvariantCulture).ToTestEnum(); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,True).cs index f105807bcc3..50c6b59e268 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,False,True).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); - global::Sample.Models.TestEnum? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::Sample.Models.TestEnum?)null) : int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture).ToTestEnum(); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::Sample.Models.TestEnum? value = (content == "null") ? ((global::Sample.Models.TestEnum?)null) : int.Parse(content, global::System.Globalization.CultureInfo.InvariantCulture).ToTestEnum(); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,False).cs index 0666d6f51d8..6076a3a76f8 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,False).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); - global::Sample.Models.TestEnum value = new global::Sample.Models.TestEnum(int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture)); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::Sample.Models.TestEnum value = new global::Sample.Models.TestEnum(int.Parse(content, global::System.Globalization.CultureInfo.InvariantCulture)); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,True).cs index 39faab9a647..d64c68f1027 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(False,True,True).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); - global::Sample.Models.TestEnum? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture)); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::Sample.Models.TestEnum? value = (content == "null") ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(int.Parse(content, global::System.Globalization.CultureInfo.InvariantCulture)); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,False).cs index f360b4939f1..5db2345600e 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,False).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); - global::Sample.Models.TestEnum value = result.GetRawResponse().Content.ToString().TrimStart('').ToTestEnum(); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::Sample.Models.TestEnum value = content.ToTestEnum(); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,True).cs index 3724b0d34db..d2a202f6cfd 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,False,True).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); - global::Sample.Models.TestEnum? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::Sample.Models.TestEnum?)null) : result.GetRawResponse().Content.ToString().TrimStart('').ToTestEnum(); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::Sample.Models.TestEnum? value = (content == "null") ? ((global::Sample.Models.TestEnum?)null) : content.ToTestEnum(); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,False).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,False).cs index 6fa4400555e..c2384e9e4a1 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,False).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,False).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); - global::Sample.Models.TestEnum value = new global::Sample.Models.TestEnum(result.GetRawResponse().Content.ToString().TrimStart('')); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::Sample.Models.TestEnum value = new global::Sample.Models.TestEnum(content); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,True).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,True).cs index dd584b67d9a..623779b8b72 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,True).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextEnumReturnTypeMethods(True,True,True).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextEnum(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextEnum(cancellationToken.ToRequestOptions()); - global::Sample.Models.TestEnum? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(result.GetRawResponse().Content.ToString().TrimStart('')); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::Sample.Models.TestEnum? value = (content == "null") ? ((global::Sample.Models.TestEnum?)null) : new global::Sample.Models.TestEnum(content); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Boolean).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Boolean).cs index f2f666c704a..e60aa9f8da9 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Boolean).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Boolean).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); - bool value = bool.Parse(result.GetRawResponse().Content.ToString().TrimStart('')); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + bool value = bool.Parse(content); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(BooleanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(BooleanNullable).cs index 2f89f35b043..ca99c0f17d5 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(BooleanNullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(BooleanNullable).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); - bool? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((bool?)null) : bool.Parse(result.GetRawResponse().Content.ToString().TrimStart('')); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + bool? value = (content == "null") ? ((bool?)null) : bool.Parse(content); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(DateTimeOffset).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(DateTimeOffset).cs index 4ca6d99cb2a..2096ab0828b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(DateTimeOffset).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(DateTimeOffset).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); - global::System.DateTimeOffset value = global::Sample.TypeFormatters.ParseDateTimeOffset(result.GetRawResponse().Content.ToString().TrimStart(''), "D"); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::System.DateTimeOffset value = global::Sample.TypeFormatters.ParseDateTimeOffset(content, "D"); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32).cs index e320659eb5b..5830cf55741 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); - int value = int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + int value = int.Parse(content, global::System.Globalization.CultureInfo.InvariantCulture); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32Nullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32Nullable).cs index 8ec8038a396..7effa4ebe9c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32Nullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Int32Nullable).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); - int? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((int?)null) : int.Parse(result.GetRawResponse().Content.ToString().TrimStart(''), global::System.Globalization.CultureInfo.InvariantCulture); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + int? value = (content == "null") ? ((int?)null) : int.Parse(content, global::System.Globalization.CultureInfo.InvariantCulture); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpan).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpan).cs index fb368f8ef33..d9c3cf72cbd 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpan).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpan).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); - global::System.TimeSpan value = global::Sample.TypeFormatters.ParseTimeSpan(result.GetRawResponse().Content.ToString().TrimStart(''), "c"); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::System.TimeSpan value = global::Sample.TypeFormatters.ParseTimeSpan(content, "c"); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpanNullable).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpanNullable).cs index 9229cc2065f..d3f255bbac3 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpanNullable).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(TimeSpanNullable).cs @@ -1,6 +1,7 @@ public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) { global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); - global::System.TimeSpan? value = (result.GetRawResponse().Content.ToString().TrimStart('') == "null") ? ((global::System.TimeSpan?)null) : global::Sample.TypeFormatters.ParseTimeSpan(result.GetRawResponse().Content.ToString().TrimStart(''), "c"); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::System.TimeSpan? value = (content == "null") ? ((global::System.TimeSpan?)null) : global::Sample.TypeFormatters.ParseTimeSpan(content, "c"); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } From ca77e1dcac19c4e7d60fdacacd169f7a5807af86 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 21:26:58 +0000 Subject: [PATCH 13/21] fix(http-client-csharp): fix unreachable text/plain conversion for excluded scalar types Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/ScmMethodProviderCollection.cs | 12 +++++++++++- .../Providers/ScmMethodProviderCollectionTests.cs | 6 ++++++ .../PlainTextScalarReturnTypeMethods(Byte).cs | 7 +++++++ .../PlainTextScalarReturnTypeMethods(SByte).cs | 7 +++++++ .../PlainTextScalarReturnTypeMethods(Uri).cs | 7 +++++++ 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Byte).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(SByte).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Uri).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index 88ab08c8ecd..c5a82773746 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -297,7 +297,7 @@ .. GetStackVariablesForProtocolParamConversion(convenienceBodyParameters, out va .. GetStackVariablesForProtocolParamConversion(convenienceBodyParameters, out var paramDeclarations), Declare("result", This.Invoke(protocolMethod.Signature, [.. GetProtocolMethodArguments(paramDeclarations)], isAsync).ToApi(), out ClientResponseApi result), .. GetStackVariablesForReturnValueConversion(result, responseBodyType, isAsync, out var resultDeclarations), - IsConvertibleFromBinaryData(responseBodyType) + ShouldUseResultConversionStatements(responseBodyType) ? GetResultConversionStatements(result, result.GetRawResponse(), responseBodyType, resultDeclarations) : new[] @@ -1013,6 +1013,16 @@ private static bool ShouldBuildStackVarForFrameworkType(CSharpType type) type.Equals(typeof(Guid?)); } + // Text/plain primitive and enum responses are parsed directly from the response content, bypassing the + // BinaryData/JsonDocument conversion path entirely. Route them through GetResultConversionStatements even + // when the response body type isn't in the IsConvertibleFromBinaryData allow-list (e.g. Guid, Uri, or the + // byte/short/unsigned integer types), otherwise they would incorrectly fall back to JSON parsing. + private bool ShouldUseResultConversionStatements(CSharpType responseBodyType) + { + return IsConvertibleFromBinaryData(responseBodyType) + || ((responseBodyType.IsFrameworkType || responseBodyType.IsEnum) && HasOnlyPlainTextContentType()); + } + private static bool IsConvertibleFromBinaryData(CSharpType type) { if (type.Equals(typeof(BinaryData))) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs index eb417a075f0..9e34f8bb6fc 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs @@ -1678,6 +1678,9 @@ public void PlainTextReturnTypeMethods() [TestCase(typeof(TimeSpan))] [TestCase(typeof(TimeSpan?))] [TestCase(typeof(DateTimeOffset))] + [TestCase(typeof(Uri))] + [TestCase(typeof(byte))] + [TestCase(typeof(sbyte))] public void PlainTextScalarReturnTypeMethods(Type type) { var underlyingType = Nullable.GetUnderlyingType(type); @@ -1687,6 +1690,9 @@ public void PlainTextScalarReturnTypeMethods(Type type) { } t when t == typeof(bool) => InputPrimitiveType.Boolean, { } t when t == typeof(TimeSpan) => InputPrimitiveType.PlainTime, { } t when t == typeof(DateTimeOffset) => InputPrimitiveType.PlainDate, + { } t when t == typeof(Uri) => InputPrimitiveType.Url, + { } t when t == typeof(byte) => new InputPrimitiveType(InputPrimitiveTypeKind.UInt8, "uint8", "TypeSpec.uint8"), + { } t when t == typeof(sbyte) => new InputPrimitiveType(InputPrimitiveTypeKind.Int8, "int8", "TypeSpec.int8"), _ => throw new NotSupportedException() }; if (underlyingType != null) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Byte).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Byte).cs new file mode 100644 index 00000000000..0f2787434cd --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Byte).cs @@ -0,0 +1,7 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + byte value = byte.Parse(content, global::System.Globalization.CultureInfo.InvariantCulture); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(SByte).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(SByte).cs new file mode 100644 index 00000000000..59c32d7181d --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(SByte).cs @@ -0,0 +1,7 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + sbyte value = sbyte.Parse(content, global::System.Globalization.CultureInfo.InvariantCulture); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Uri).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Uri).cs new file mode 100644 index 00000000000..0df7aa47628 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Uri).cs @@ -0,0 +1,7 @@ +public virtual global::System.ClientModel.ClientResult GetPlainTextScalar(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + global::System.Uri value = new global::System.Uri(content); + return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); +} From 26058cc6c86c4142d0b1c1e6376e84b987be1e72 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 21:43:51 +0000 Subject: [PATCH 14/21] refactor(http-client-csharp): inline single-use ShouldUseResultConversionStatements helper Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index c5a82773746..ad7248cc6ab 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -297,7 +297,12 @@ .. GetStackVariablesForProtocolParamConversion(convenienceBodyParameters, out va .. GetStackVariablesForProtocolParamConversion(convenienceBodyParameters, out var paramDeclarations), Declare("result", This.Invoke(protocolMethod.Signature, [.. GetProtocolMethodArguments(paramDeclarations)], isAsync).ToApi(), out ClientResponseApi result), .. GetStackVariablesForReturnValueConversion(result, responseBodyType, isAsync, out var resultDeclarations), - ShouldUseResultConversionStatements(responseBodyType) + // Text/plain primitive and enum responses are parsed directly from the response content, bypassing the + // BinaryData/JsonDocument conversion path entirely. Route them through GetResultConversionStatements even + // when the response body type isn't in the IsConvertibleFromBinaryData allow-list (e.g. Guid, Uri, or the + // byte/short/unsigned integer types), otherwise they would incorrectly fall back to JSON parsing. + IsConvertibleFromBinaryData(responseBodyType) + || ((responseBodyType.IsFrameworkType || responseBodyType.IsEnum) && HasOnlyPlainTextContentType()) ? GetResultConversionStatements(result, result.GetRawResponse(), responseBodyType, resultDeclarations) : new[] @@ -1013,16 +1018,6 @@ private static bool ShouldBuildStackVarForFrameworkType(CSharpType type) type.Equals(typeof(Guid?)); } - // Text/plain primitive and enum responses are parsed directly from the response content, bypassing the - // BinaryData/JsonDocument conversion path entirely. Route them through GetResultConversionStatements even - // when the response body type isn't in the IsConvertibleFromBinaryData allow-list (e.g. Guid, Uri, or the - // byte/short/unsigned integer types), otherwise they would incorrectly fall back to JSON parsing. - private bool ShouldUseResultConversionStatements(CSharpType responseBodyType) - { - return IsConvertibleFromBinaryData(responseBodyType) - || ((responseBodyType.IsFrameworkType || responseBodyType.IsEnum) && HasOnlyPlainTextContentType()); - } - private static bool IsConvertibleFromBinaryData(CSharpType type) { if (type.Equals(typeof(BinaryData))) From f7cd15f7446997a238f994044e3f2219a1a0034c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 22:46:16 +0000 Subject: [PATCH 15/21] chore(http-client-csharp): regenerate Sample-TypeSpec test project Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs index 58eac4ed6dd..e516a3707e6 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs @@ -1086,7 +1086,8 @@ public virtual async Task GetUnknownValueAsync(RequestOptions opti public virtual ClientResult GetUnknownValue(CancellationToken cancellationToken = default) { ClientResult result = GetUnknownValue(cancellationToken.ToRequestOptions()); - DaysOfWeekExtensibleEnum value = new DaysOfWeekExtensibleEnum(result.GetRawResponse().Content.ToString().TrimStart('')); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + DaysOfWeekExtensibleEnum value = new DaysOfWeekExtensibleEnum(content); return ClientResult.FromValue(value, result.GetRawResponse()); } @@ -1096,7 +1097,8 @@ public virtual ClientResult GetUnknownValue(Cancellati public virtual async Task> GetUnknownValueAsync(CancellationToken cancellationToken = default) { ClientResult result = await GetUnknownValueAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); - DaysOfWeekExtensibleEnum value = new DaysOfWeekExtensibleEnum(result.GetRawResponse().Content.ToString().TrimStart('')); + string content = result.GetRawResponse().Content.ToString().TrimStart(''); + DaysOfWeekExtensibleEnum value = new DaysOfWeekExtensibleEnum(content); return ClientResult.FromValue(value, result.GetRawResponse()); } From 59cd7789a3e9e8c0630a345ccbecb902536a8b27 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Sep 2026 22:39:56 +0000 Subject: [PATCH 16/21] fix(http-client-csharp): restrict raw text response parsing to primitive and enum types Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 79 +++++++++++++------ .../ScmMethodProviderCollectionTests.cs | 33 ++++++++ ...sPreserveExistingConversion(BinaryData).cs | 5 ++ ...sPreserveExistingConversion(Dictionary).cs | 19 +++++ ...sponsesPreserveExistingConversion(List).cs | 17 ++++ ...ponsesPreserveExistingConversion(Model).cs | 5 ++ 6 files changed, 133 insertions(+), 25 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(BinaryData).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(Dictionary).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(List).cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(Model).cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index ad7248cc6ab..ef794a60a42 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -302,7 +302,7 @@ .. GetStackVariablesForReturnValueConversion(result, responseBodyType, isAsync, // when the response body type isn't in the IsConvertibleFromBinaryData allow-list (e.g. Guid, Uri, or the // byte/short/unsigned integer types), otherwise they would incorrectly fall back to JSON parsing. IsConvertibleFromBinaryData(responseBodyType) - || ((responseBodyType.IsFrameworkType || responseBodyType.IsEnum) && HasOnlyPlainTextContentType()) + || (IsPlainTextParsableType(responseBodyType) && HasOnlyPlainTextContentType()) ? GetResultConversionStatements(result, result.GetRawResponse(), responseBodyType, resultDeclarations) : new[] @@ -864,7 +864,7 @@ private MethodBodyStatement AddElement(ValueExpression? dictKey, ValueExpression private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi result, HttpResponseApi response, CSharpType responseBodyType, Dictionary declarations) { - if (!responseBodyType.Equals(typeof(string)) && HasOnlyPlainTextContentType()) + if (!responseBodyType.Equals(typeof(string)) && IsPlainTextParsableType(responseBodyType) && HasOnlyPlainTextContentType()) { var contentExpression = response.Content().InvokeToString().Invoke(nameof(string.TrimStart), Literal('\uFEFF')).As(); return @@ -931,17 +931,11 @@ private ValueExpression GetResultConversion(ClientResponseApi result, HttpRespon private ValueExpression GetPlainTextValueConversion(CSharpType responseBodyType, ValueExpression content) { - var nonNullableType = responseBodyType.WithNullable(false); - var typeToDeserialize = nonNullableType; - CSharpType? enumType = null; - if (nonNullableType is { IsEnum: true, UnderlyingEnumType: { } underlyingEnumType }) - { - enumType = nonNullableType; - typeToDeserialize = underlyingEnumType; - } + var parseType = GetPlainTextParseType(responseBodyType, out var enumType) + ?? throw new InvalidOperationException($"Unsupported plain text response type: {responseBodyType}."); var invariantCulture = new MemberExpression(typeof(CultureInfo), nameof(CultureInfo.InvariantCulture)); - var deserializedValue = typeToDeserialize.FrameworkType switch + var deserializedValue = parseType switch { Type t when t == typeof(string) => content, Type t when t == typeof(bool) => Static().Invoke(nameof(bool.Parse), content).As(), @@ -949,20 +943,8 @@ private ValueExpression GetPlainTextValueConversion(CSharpType responseBodyType, Type t when t == typeof(Uri) => New.Instance(typeof(Uri), content), Type t when t == typeof(TimeSpan) => content.As().ParseTimeSpan(Literal(SerializationFormat.Duration_Constant.ToFormatSpecifier() ?? throw new InvalidOperationException())), Type t when t == typeof(DateTimeOffset) => content.As().ParseDateTimeOffset(Literal(GetResponseSerializationFormat().ToFormatSpecifier())), - Type frameworkType when typeToDeserialize.IsFrameworkType - && (frameworkType == typeof(byte) - || frameworkType == typeof(sbyte) - || frameworkType == typeof(short) - || frameworkType == typeof(ushort) - || frameworkType == typeof(int) - || frameworkType == typeof(uint) - || frameworkType == typeof(long) - || frameworkType == typeof(ulong) - || frameworkType == typeof(float) - || frameworkType == typeof(double) - || frameworkType == typeof(decimal)) - => Static(frameworkType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(frameworkType), - _ => Static(typeToDeserialize.FrameworkType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(typeToDeserialize.FrameworkType) + // The remaining supported types are numeric and all expose a static Parse(string, IFormatProvider) method. + _ => Static(parseType).Invoke(nameof(int.Parse), [content, invariantCulture]).As(parseType) }; if (enumType is not null) @@ -975,6 +957,53 @@ Type frameworkType when typeToDeserialize.IsFrameworkType : deserializedValue; } + private static bool IsPlainTextParsableType(CSharpType responseBodyType) + => GetPlainTextParseType(responseBodyType, out _) is not null; + + /// + /// Gets the framework type that a raw text response body is parsed into, or null when the response body + /// type isn't a primitive or enum that can be parsed from raw text. Types such as , + /// collections and generated models keep their existing conversion. + /// + private static Type? GetPlainTextParseType(CSharpType responseBodyType, out CSharpType? enumType) + { + enumType = null; + var typeToParse = responseBodyType.WithNullable(false); + if (typeToParse is { IsEnum: true, UnderlyingEnumType: { } underlyingEnumType }) + { + enumType = typeToParse; + typeToParse = underlyingEnumType; + } + + if (!typeToParse.IsFrameworkType) + { + return null; + } + + var frameworkType = typeToParse.FrameworkType; + return frameworkType switch + { + Type t when t == typeof(string) + || t == typeof(bool) + || t == typeof(Guid) + || t == typeof(Uri) + || t == typeof(TimeSpan) + || t == typeof(DateTimeOffset) + || t == typeof(byte) + || t == typeof(sbyte) + || t == typeof(short) + || t == typeof(ushort) + || t == typeof(int) + || t == typeof(uint) + || t == typeof(long) + || t == typeof(ulong) + || t == typeof(float) + || t == typeof(double) + || t == typeof(decimal) => frameworkType, + _ => null + }; + } + private bool HasOnlyPlainTextContentType() { var contentTypes = ServiceMethod.Operation.Responses diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs index 9e34f8bb6fc..ff20c62cf10 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ScmMethodProviderCollectionTests.cs @@ -1749,6 +1749,39 @@ public void PlainTextEnumReturnTypeMethods(bool isString, bool isExtensible, boo Assert.AreEqual(Helpers.GetExpectedFromFile($"{isString},{isExtensible},{isNullable}"), writer.ToString(false)); } + [TestCase("BinaryData")] + [TestCase("Model")] + [TestCase("List")] + [TestCase("Dictionary")] + public void PlainTextSpecialCaseResponsesPreserveExistingConversion(string kind) + { + // Raw binary, generated model and collection responses are not parsed from raw text even when text/plain + // is their only content type, they keep their existing conversion. + InputType inputType = kind switch + { + "BinaryData" => InputPrimitiveType.Any, + "Model" => InputFactory.Model("TestModel", properties: + [InputFactory.Property("name", InputPrimitiveType.String, isRequired: true)]), + "List" => InputFactory.Array(InputPrimitiveType.Int32), + "Dictionary" => InputFactory.Dictionary(InputPrimitiveType.Int32), + _ => throw new NotSupportedException() + }; + + var operation = InputFactory.Operation("GetSpecialCase", responses: + [InputFactory.OperationResponse([200], inputType, contentTypes: ["text/plain"])]); + var serviceMethod = InputFactory.BasicServiceMethod("GetSpecialCase", operation); + var inputClient = InputFactory.Client("TestClient", methods: [serviceMethod]); + + MockHelpers.LoadMockGenerator(); + var client = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(inputClient); + var method = new ScmMethodProviderCollection(serviceMethod, client!) + .Single(m => m.Kind == ScmMethodKind.Convenience && m.Signature.Name == "GetSpecialCase"); + + using var writer = new CodeWriter(); + writer.WriteMethod(method); + Assert.AreEqual(Helpers.GetExpectedFromFile(kind), writer.ToString(false)); + } + [Test] public void MixedContentTypeScalarResponseUsesJsonConversion() { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(BinaryData).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(BinaryData).cs new file mode 100644 index 00000000000..887f2fc78ac --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(BinaryData).cs @@ -0,0 +1,5 @@ +public virtual global::System.ClientModel.ClientResult GetSpecialCase(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetSpecialCase(cancellationToken.ToRequestOptions()); + return global::System.ClientModel.ClientResult.FromValue(result.GetRawResponse().Content, result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(Dictionary).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(Dictionary).cs new file mode 100644 index 00000000000..38cd0036aa4 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(Dictionary).cs @@ -0,0 +1,19 @@ +public virtual global::System.ClientModel.ClientResult> GetSpecialCase(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetSpecialCase(cancellationToken.ToRequestOptions()); + global::System.Collections.Generic.IDictionary value = new global::System.Collections.Generic.Dictionary(); + global::System.BinaryData data = result.GetRawResponse().Content; + global::System.Text.Json.Utf8JsonReader jsonReader = new global::System.Text.Json.Utf8JsonReader(data.ToMemory().Span); + jsonReader.Read(); + while (jsonReader.Read()) + { + if ((jsonReader.TokenType == global::System.Text.Json.JsonTokenType.EndObject)) + { + break; + } + string propertyName = jsonReader.GetString(); + jsonReader.Read(); + value.Add(propertyName, jsonReader.GetInt32()); + } + return global::System.ClientModel.ClientResult.FromValue(((global::System.Collections.Generic.IReadOnlyDictionary)value), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(List).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(List).cs new file mode 100644 index 00000000000..e5c154635df --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(List).cs @@ -0,0 +1,17 @@ +public virtual global::System.ClientModel.ClientResult> GetSpecialCase(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetSpecialCase(cancellationToken.ToRequestOptions()); + global::System.Collections.Generic.List value = new global::System.Collections.Generic.List(); + global::System.BinaryData data = result.GetRawResponse().Content; + global::System.Text.Json.Utf8JsonReader jsonReader = new global::System.Text.Json.Utf8JsonReader(data.ToMemory().Span); + jsonReader.Read(); + while (jsonReader.Read()) + { + if ((jsonReader.TokenType == global::System.Text.Json.JsonTokenType.EndArray)) + { + break; + } + value.Add(jsonReader.GetInt32()); + } + return global::System.ClientModel.ClientResult.FromValue(((global::System.Collections.Generic.IReadOnlyList)value), result.GetRawResponse()); +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(Model).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(Model).cs new file mode 100644 index 00000000000..bd099dc8b94 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextSpecialCaseResponsesPreserveExistingConversion(Model).cs @@ -0,0 +1,5 @@ +public virtual global::System.ClientModel.ClientResult GetSpecialCase(global::System.Threading.CancellationToken cancellationToken = default) +{ + global::System.ClientModel.ClientResult result = this.GetSpecialCase(cancellationToken.ToRequestOptions()); + return global::System.ClientModel.ClientResult.FromValue(((global::Sample.Models.TestModel)result), result.GetRawResponse()); +} From 46fc557ff115c12fb3bff85543327950e27a2351 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Sep 2026 22:44:10 +0000 Subject: [PATCH 17/21] fix(http-client-csharp): allow relative URIs in plain text response parsing Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/ScmMethodProviderCollection.cs | 2 +- .../PlainTextScalarReturnTypeMethods(Uri).cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index ef794a60a42..aaaa27e855a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -940,7 +940,7 @@ private ValueExpression GetPlainTextValueConversion(CSharpType responseBodyType, Type t when t == typeof(string) => content, Type t when t == typeof(bool) => Static().Invoke(nameof(bool.Parse), content).As(), Type t when t == typeof(Guid) => Static().Invoke(nameof(Guid.Parse), content).As(), - Type t when t == typeof(Uri) => New.Instance(typeof(Uri), content), + Type t when t == typeof(Uri) => New.Instance(content, FrameworkEnumValue(UriKind.RelativeOrAbsolute)), Type t when t == typeof(TimeSpan) => content.As().ParseTimeSpan(Literal(SerializationFormat.Duration_Constant.ToFormatSpecifier() ?? throw new InvalidOperationException())), Type t when t == typeof(DateTimeOffset) => content.As().ParseDateTimeOffset(Literal(GetResponseSerializationFormat().ToFormatSpecifier())), // The remaining supported types are numeric and all expose a static Parse(string, IFormatProvider) method. diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Uri).cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Uri).cs index 0df7aa47628..e657b2b0bb5 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Uri).cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/PlainTextScalarReturnTypeMethods(Uri).cs @@ -2,6 +2,6 @@ { global::System.ClientModel.ClientResult result = this.GetPlainTextScalar(cancellationToken.ToRequestOptions()); string content = result.GetRawResponse().Content.ToString().TrimStart(''); - global::System.Uri value = new global::System.Uri(content); + global::System.Uri value = new global::System.Uri(content, global::System.UriKind.RelativeOrAbsolute); return global::System.ClientModel.ClientResult.FromValue(value, result.GetRawResponse()); } From 30b94133dfb92db7677cdb45f4626df22b4baf56 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Sep 2026 22:57:32 +0000 Subject: [PATCH 18/21] fix(http-client-csharp): return null for unsupported plain text conversions Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index aaaa27e855a..36661fea3be 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -867,12 +867,16 @@ private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi re if (!responseBodyType.Equals(typeof(string)) && IsPlainTextParsableType(responseBodyType) && HasOnlyPlainTextContentType()) { var contentExpression = response.Content().InvokeToString().Invoke(nameof(string.TrimStart), Literal('\uFEFF')).As(); - return - [ - Declare("content", typeof(string), contentExpression, out var content), - Declare("value", responseBodyType, GetPlainTextValueConversion(responseBodyType, content), out var value), - Return(result.FromValue(value, response)) - ]; + var contentDeclaration = Declare("content", typeof(string), contentExpression, out var content); + if (GetPlainTextValueConversion(responseBodyType, content) is { } valueExpression) + { + return + [ + contentDeclaration, + Declare("value", responseBodyType, valueExpression, out var value), + Return(result.FromValue(value, response)) + ]; + } } var isSpecialCaseType = responseBodyType.Equals(typeof(BinaryData)) @@ -929,10 +933,13 @@ private ValueExpression GetResultConversion(ClientResponseApi result, HttpRespon return result.CastTo(responseBodyType); } - private ValueExpression GetPlainTextValueConversion(CSharpType responseBodyType, ValueExpression content) + private ValueExpression? GetPlainTextValueConversion(CSharpType responseBodyType, ValueExpression content) { - var parseType = GetPlainTextParseType(responseBodyType, out var enumType) - ?? throw new InvalidOperationException($"Unsupported plain text response type: {responseBodyType}."); + var parseType = GetPlainTextParseType(responseBodyType, out var enumType); + if (parseType is null) + { + return null; + } var invariantCulture = new MemberExpression(typeof(CultureInfo), nameof(CultureInfo.InvariantCulture)); var deserializedValue = parseType switch From de7abee1d3fdfdc3b09aef5f0cfe03cc3990d42d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Sep 2026 22:58:56 +0000 Subject: [PATCH 19/21] refactor(http-client-csharp): resolve plain text parser before content Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../Providers/ScmMethodProviderCollection.cs | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index 36661fea3be..4e3c070c9a3 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -864,19 +864,16 @@ private MethodBodyStatement AddElement(ValueExpression? dictKey, ValueExpression private MethodBodyStatement[] GetResultConversionStatements(ClientResponseApi result, HttpResponseApi response, CSharpType responseBodyType, Dictionary declarations) { - if (!responseBodyType.Equals(typeof(string)) && IsPlainTextParsableType(responseBodyType) && HasOnlyPlainTextContentType()) + var plainTextParseType = GetPlainTextParseType(responseBodyType, out var enumType); + if (!responseBodyType.Equals(typeof(string)) && plainTextParseType is not null && HasOnlyPlainTextContentType()) { var contentExpression = response.Content().InvokeToString().Invoke(nameof(string.TrimStart), Literal('\uFEFF')).As(); - var contentDeclaration = Declare("content", typeof(string), contentExpression, out var content); - if (GetPlainTextValueConversion(responseBodyType, content) is { } valueExpression) - { - return - [ - contentDeclaration, - Declare("value", responseBodyType, valueExpression, out var value), - Return(result.FromValue(value, response)) - ]; - } + return + [ + Declare("content", typeof(string), contentExpression, out var content), + Declare("value", responseBodyType, GetPlainTextValueConversion(responseBodyType, plainTextParseType, enumType, content), out var value), + Return(result.FromValue(value, response)) + ]; } var isSpecialCaseType = responseBodyType.Equals(typeof(BinaryData)) @@ -933,14 +930,8 @@ private ValueExpression GetResultConversion(ClientResponseApi result, HttpRespon return result.CastTo(responseBodyType); } - private ValueExpression? GetPlainTextValueConversion(CSharpType responseBodyType, ValueExpression content) + private ValueExpression GetPlainTextValueConversion(CSharpType responseBodyType, Type parseType, CSharpType? enumType, ValueExpression content) { - var parseType = GetPlainTextParseType(responseBodyType, out var enumType); - if (parseType is null) - { - return null; - } - var invariantCulture = new MemberExpression(typeof(CultureInfo), nameof(CultureInfo.InvariantCulture)); var deserializedValue = parseType switch { From cd41087c9e00a39e9768e6fbea8879f1c6004d03 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Sep 2026 23:11:20 +0000 Subject: [PATCH 20/21] test(http-client-csharp): avoid FEFF token in Local extensible enum test Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../TestProjects/Local.Tests/ExtensibleEnumTests.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs index 2e58189ccf3..30b94d70932 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -// cspell:ignore FEFF - using System; using System.ClientModel; using System.ClientModel.Primitives; @@ -24,7 +22,8 @@ public class ExtensibleEnumTests [TestCase(true, true)] public async Task EnumResponseDeserialization(bool hasBom, bool isAsync) { - var content = BinaryData.FromString((hasBom ? "\uFEFF" : "") + "Monday"); + var bom = hasBom ? char.ConvertFromUtf32(65279) : string.Empty; + var content = BinaryData.FromString(bom + "Monday"); var response = new Mock(); response.SetupGet(r => r.Content).Returns(content); var protocolResult = ClientResult.FromResponse(response.Object); From 2c5ad788e9b5450e8b8fcc081d09dc39e57a4ae9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Sep 2026 23:12:07 +0000 Subject: [PATCH 21/21] test(http-client-csharp): build BOM prefix from UTF-8 preamble Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs index 30b94d70932..6874e0fdbd4 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local.Tests/ExtensibleEnumTests.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Text; using System.Threading.Tasks; using Moq; using NUnit.Framework; @@ -22,7 +23,7 @@ public class ExtensibleEnumTests [TestCase(true, true)] public async Task EnumResponseDeserialization(bool hasBom, bool isAsync) { - var bom = hasBom ? char.ConvertFromUtf32(65279) : string.Empty; + var bom = hasBom ? Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble()) : string.Empty; var content = BinaryData.FromString(bom + "Monday"); var response = new Mock(); response.SetupGet(r => r.Content).Returns(content);