Skip to content

Commit b989743

Browse files
Don't mutate LRO operator multiple times (Azure#53304)
1 parent 6c2a563 commit b989743

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

eng/packages/http-client-csharp/generator/Azure.Generator/src/Visitors/LroVisitor.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using System.Runtime.CompilerServices;
8+
using System.Text.Json;
89
using System.Threading.Tasks;
910
using Azure.Core;
1011
using Azure.Generator.Providers;
@@ -14,6 +15,7 @@
1415
using Microsoft.TypeSpec.Generator.Input;
1516
using Microsoft.TypeSpec.Generator.Primitives;
1617
using Microsoft.TypeSpec.Generator.Providers;
18+
using Microsoft.TypeSpec.Generator.Snippets;
1719
using Microsoft.TypeSpec.Generator.Statements;
1820
using static Microsoft.TypeSpec.Generator.Snippets.Snippet;
1921

@@ -57,16 +59,24 @@ private static void UpdateExplicitOperatorMethod(
5759

5860
foreach (var statement in explicitOperator.BodyStatements!)
5961
{
60-
if (statement is ExpressionStatement { Expression: KeywordExpression
61-
{ Keyword: "return", Expression: InvokeMethodExpression invokeMethodExpression } })
62+
if (statement is ExpressionStatement
63+
{
64+
Expression: KeywordExpression
65+
{
66+
Keyword: "return", Expression: InvokeMethodExpression invokeMethodExpression
67+
}
68+
})
6269
{
63-
invokeMethodExpression.Update(
64-
arguments:
65-
[
66-
invokeMethodExpression.Arguments[0]
67-
.Invoke("GetProperty", Literal(resultSegment)),
68-
..invokeMethodExpression.Arguments.Skip(1)
69-
]);
70+
if (invokeMethodExpression.Arguments.Count > 0 && invokeMethodExpression.Arguments[0] is ScopedApi<JsonElement>)
71+
{
72+
invokeMethodExpression.Update(
73+
arguments:
74+
[
75+
invokeMethodExpression.Arguments[0]
76+
.Invoke("GetProperty", Literal(resultSegment)),
77+
..invokeMethodExpression.Arguments.Skip(1)
78+
]);
79+
}
7080
}
7181
}
7282
}

eng/packages/http-client-csharp/generator/Azure.Generator/test/Visitors/LroVisitorTests.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,15 @@ public void UpdatesExplicitOperatorToUseResultSegment()
162162
Assert.IsNotNull(explicitOperator!.BodyStatements);
163163
var result = explicitOperator!.BodyStatements!.ToDisplayString();
164164
Assert.AreEqual(Helpers.GetExpectedFromFile(), result);
165+
166+
// does not mutate an already mutated operator
167+
visitor.InvokeVisitServiceMethod(lroServiceMethod, clientProvider!, methodCollection);
168+
serializationProvider = responseModelProvider!.SerializationProviders[0];
169+
explicitOperator = serializationProvider.Methods
170+
.FirstOrDefault(m => m.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Explicit) &&
171+
m.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Operator));
172+
result = explicitOperator!.BodyStatements!.ToDisplayString();
173+
Assert.AreEqual(Helpers.GetExpectedFromFile(), result);
165174
}
166175

167176
[Test]

0 commit comments

Comments
 (0)