Skip to content

Commit 6727e90

Browse files
Fix explicit operator param name and remove no-op assignment (#8858)
Contributes to Azure/azure-sdk-for-net#53553 Also, removes disposal of the raw response - this is a no-op for buffered streams, but for unbuffered it is the library user's responsibility.
1 parent 11909fc commit 6727e90

18 files changed

+75
-23
lines changed

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/Abstractions/ClientResponseApi.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ protected ClientResponseApi(Type type, ValueExpression original) : base(type, or
3939

4040
public abstract CSharpType ClientCollectionResponseOfTType { get; }
4141
public abstract CSharpType ClientCollectionAsyncResponseOfTType { get; }
42+
public abstract string ResponseParameterName { get; }
4243

4344
public abstract TypeProvider CreateClientCollectionResultDefinition(
4445
ClientProvider client,

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/Abstractions/IClientResponseApi.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public interface IClientResponseApi : IExpressionApi<ClientResponseApi>
2323

2424
CSharpType ClientCollectionAsyncResponseOfTType { get; }
2525

26+
string ResponseParameterName { get; }
27+
2628
TypeProvider CreateClientCollectionResultDefinition(
2729
ClientProvider client,
2830
InputPagingServiceMethod serviceMethod,

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientResultProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public ClientResultProvider(ValueExpression clientResult) : base(typeof(ClientRe
2828
public override CSharpType ClientCollectionAsyncResponseType => typeof(AsyncCollectionResult);
2929
public override CSharpType ClientCollectionResponseOfTType => typeof(CollectionResult<>);
3030
public override CSharpType ClientCollectionAsyncResponseOfTType => typeof(AsyncCollectionResult<>);
31+
public override string ResponseParameterName => "result";
3132

3233
public override TypeProvider CreateClientCollectionResultDefinition(
3334
ClientProvider client,

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/MrwSerializationTypeDefinition.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,27 @@ protected override MethodProvider[] BuildMethods()
216216

217217
private MethodProvider BuildExplicitFromClientResult()
218218
{
219-
var result = new ParameterProvider("result", $"The {ScmCodeModelGenerator.Instance.TypeFactory.ClientResponseApi.ClientResponseType:C} to deserialize the {Type:C} from.", ScmCodeModelGenerator.Instance.TypeFactory.ClientResponseApi.ClientResponseType);
220-
var modifiers = MethodSignatureModifiers.Public | MethodSignatureModifiers.Static | MethodSignatureModifiers.Explicit | MethodSignatureModifiers.Operator;
219+
var result = new ParameterProvider(
220+
ScmCodeModelGenerator.Instance.TypeFactory.ClientResponseApi.ResponseParameterName,
221+
$"The {ScmCodeModelGenerator.Instance.TypeFactory.ClientResponseApi.ClientResponseType:C} to deserialize the {Type:C} from.",
222+
ScmCodeModelGenerator.Instance.TypeFactory.ClientResponseApi.ClientResponseType);
223+
var modifiers = MethodSignatureModifiers.Public | MethodSignatureModifiers.Static |
224+
MethodSignatureModifiers.Explicit | MethodSignatureModifiers.Operator;
221225
// using PipelineResponse response = result.GetRawResponse();
222-
var responseDeclaration = UsingDeclare("response", ScmCodeModelGenerator.Instance.TypeFactory.HttpResponseApi.HttpResponseType, result.ToApi<ClientResponseApi>().GetRawResponse(), out var response);
226+
var response = result.ToApi<ClientResponseApi>();
227+
MethodBodyStatement responseDeclaration;
228+
229+
// if the GetRawResponse is a no-op we don't need to declare a new variable
230+
if (response.Original == response.GetRawResponse().Original)
231+
{
232+
responseDeclaration = MethodBodyStatement.Empty;
233+
}
234+
else
235+
{
236+
responseDeclaration = Declare("response", ScmCodeModelGenerator.Instance.TypeFactory.HttpResponseApi.HttpResponseType, result.ToApi<ClientResponseApi>().GetRawResponse(), out var responseVar);
237+
response = responseVar.ToApi<ClientResponseApi>();
238+
}
239+
223240
MethodBodyStatement[] methodBody;
224241

225242
if (_model is ScmModelProvider { HasDynamicModelSupport: true })

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/Abstractions/ClientResponseApiTests.cs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ internal class ClientResponseApiTests
2222
[Test]
2323
public void ValidateReturnTypeIsOverridden()
2424
{
25-
ClientProvider clientProvider = CreateMockClientProvider();
25+
(ClientProvider clientProvider, _) = CreateMockClientProvider();
2626

2727
// take the sync version of the method from the client provider
2828
var method = clientProvider.Methods.FirstOrDefault(x => !x.Signature.Name.EndsWith("Async"));
@@ -34,7 +34,7 @@ public void ValidateReturnTypeIsOverridden()
3434
[Test]
3535
public void ValidateBodyOfClientOperationIsOverridden()
3636
{
37-
var clientProvider = CreateMockClientProvider();
37+
(ClientProvider clientProvider, _) = CreateMockClientProvider();
3838

3939
// take the sync version of the method from the client provider
4040
var method = clientProvider.Methods.FirstOrDefault(x => x.Signature.Parameters.Any(p => p.Type.Equals(typeof(RequestOptions))) && !x.Signature.Name.EndsWith("Async"));
@@ -43,14 +43,42 @@ public void ValidateBodyOfClientOperationIsOverridden()
4343
Assert.AreEqual(Helpers.GetExpectedFromFile(), method.BodyStatements!.ToDisplayString());
4444
}
4545

46-
private static ClientProvider CreateMockClientProvider()
46+
[Test]
47+
public void ValidateExplicitOperator()
48+
{
49+
(_, ModelProvider modelProvider) = CreateMockClientProvider();
50+
51+
var explicitOperator = modelProvider.SerializationProviders.First().Methods.FirstOrDefault(m => m.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Explicit));
52+
Assert.NotNull(explicitOperator);
53+
var parameter = explicitOperator!.Signature.Parameters.FirstOrDefault();
54+
Assert.NotNull(parameter);
55+
Assert.AreEqual("stringResponse", parameter!.Name);
56+
Assert.AreEqual(Helpers.GetExpectedFromFile(), explicitOperator!.BodyStatements!.ToDisplayString());
57+
}
58+
59+
private static (ClientProvider, ModelProvider) CreateMockClientProvider()
4760
{
48-
var inputServiceMethod = InputFactory.BasicServiceMethod("foo", InputFactory.Operation("foo"));
61+
var responseModel = InputFactory.Model("Bar");
62+
var operationResponse = InputFactory.OperationResponse(bodytype: responseModel);
63+
var serviceResponse = InputFactory.ServiceMethodResponse(responseModel, null);
64+
var inputServiceMethod = InputFactory.BasicServiceMethod("foo", InputFactory.Operation("foo", responses: [operationResponse]), response: serviceResponse);
4965
var client = InputFactory.Client("TestClient", methods: [inputServiceMethod]);
50-
MockHelpers.LoadMockGenerator(clientResponseApi: TestClientResponseApi.Instance);
51-
var clientProvider = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(client);
66+
67+
var generator = MockHelpers.LoadMockGenerator(
68+
clientResponseApi: TestClientResponseApi.Instance,
69+
inputModels: () => [responseModel],
70+
clients: () => [client]);
71+
var modelProvider = generator.Object.OutputLibrary.TypeProviders
72+
.OfType<ModelProvider>()
73+
.FirstOrDefault(m => m.Name == "Bar");
74+
var clientProvider = generator.Object.OutputLibrary.TypeProviders
75+
.OfType<ClientProvider>()
76+
.FirstOrDefault(c => c.Name == "TestClient");
77+
5278
Assert.IsNotNull(clientProvider);
53-
return clientProvider!;
79+
Assert.IsNotNull(modelProvider);
80+
81+
return (clientProvider!, modelProvider!);
5482
}
5583

5684
private record TestClientResponseApi : ClientResponseApi
@@ -66,7 +94,7 @@ public TestClientResponseApi(ValueExpression origin) : base(typeof(string), orig
6694
}
6795

6896
public override HttpResponseApi GetRawResponse()
69-
=> Original.Invoke("GetFakeRawResponse").ToApi<HttpResponseApi>();
97+
=> Original.ToApi<HttpResponseApi>();
7098

7199
public override ValueExpression FromValue(ValueExpression valueExpression, HttpResponseApi response)
72100
=> Original.Invoke("GetFakeFromValue");
@@ -92,6 +120,7 @@ public override ClientResponseApi FromExpression(ValueExpression original)
92120
public override CSharpType ClientCollectionAsyncResponseType => typeof(AsyncCollectionResult);
93121
public override CSharpType ClientCollectionResponseOfTType => typeof(CollectionResult<>);
94122
public override CSharpType ClientCollectionAsyncResponseOfTType => typeof(AsyncCollectionResult<>);
123+
public override string ResponseParameterName => "stringResponse";
95124

96125
public override TypeProvider CreateClientCollectionResultDefinition(
97126
ClientProvider client,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(stringResponse.Content);
2+
return global::Sample.Models.Bar.DeserializeBar(document.RootElement, global::Sample.ModelSerializationExtensions.WireOptions);

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DynamicModelSerializationTests/ExplicitClientResultOperator(False).cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public partial class Cat
1313
{
1414
public static explicit operator Cat(global::System.ClientModel.ClientResult result)
1515
{
16-
using global::System.ClientModel.Primitives.PipelineResponse response = result.GetRawResponse();
16+
global::System.ClientModel.Primitives.PipelineResponse response = result.GetRawResponse();
1717
using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(response.Content);
1818
return global::Sample.Models.Cat.DeserializeCat(document.RootElement, global::Sample.ModelSerializationExtensions.WireOptions);
1919
}

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DynamicModelSerializationTests/ExplicitClientResultOperator(True).cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public partial class Cat
1414
{
1515
public static explicit operator Cat(global::System.ClientModel.ClientResult result)
1616
{
17-
using global::System.ClientModel.Primitives.PipelineResponse response = result.GetRawResponse();
17+
global::System.ClientModel.Primitives.PipelineResponse response = result.GetRawResponse();
1818
global::System.BinaryData data = response.Content;
1919
using global::System.Text.Json.JsonDocument document = global::System.Text.Json.JsonDocument.Parse(data);
2020
return global::Sample.Models.Cat.DeserializeCat(document.RootElement, data, global::Sample.ModelSerializationExtensions.WireOptions);

packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/Friend.Serialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ public static implicit operator BinaryContent(Friend friend)
154154
/// <param name="result"> The <see cref="ClientResult"/> to deserialize the <see cref="Friend"/> from. </param>
155155
public static explicit operator Friend(ClientResult result)
156156
{
157-
using PipelineResponse response = result.GetRawResponse();
157+
PipelineResponse response = result.GetRawResponse();
158158
using JsonDocument document = JsonDocument.Parse(response.Content);
159159
return DeserializeFriend(document.RootElement, ModelSerializationExtensions.WireOptions);
160160
}

packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResponse.Serialization.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ protected virtual ListWithContinuationTokenHeaderResponseResponse PersistableMod
153153
/// <param name="result"> The <see cref="ClientResult"/> to deserialize the <see cref="ListWithContinuationTokenHeaderResponseResponse"/> from. </param>
154154
public static explicit operator ListWithContinuationTokenHeaderResponseResponse(ClientResult result)
155155
{
156-
using PipelineResponse response = result.GetRawResponse();
156+
PipelineResponse response = result.GetRawResponse();
157157
using JsonDocument document = JsonDocument.Parse(response.Content);
158158
return DeserializeListWithContinuationTokenHeaderResponseResponse(document.RootElement, ModelSerializationExtensions.WireOptions);
159159
}

0 commit comments

Comments
 (0)