Skip to content

Commit 101878f

Browse files
authored
Use VisitMethod instead of VisitType for SerializationVisitor (Azure#51670)
1 parent e9c1b31 commit 101878f

File tree

3 files changed

+60
-38
lines changed

3 files changed

+60
-38
lines changed

eng/packages/http-client-csharp-mgmt/generator/Azure.Generator.Management/src/Visitors/NameVisitor.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66
using Azure.Generator.Management.Providers;
77
using Microsoft.TypeSpec.Generator.ClientModel;
88
using Microsoft.TypeSpec.Generator.ClientModel.Providers;
9+
using Microsoft.TypeSpec.Generator.Expressions;
910
using Microsoft.TypeSpec.Generator.Input;
1011
using Microsoft.TypeSpec.Generator.Primitives;
1112
using Microsoft.TypeSpec.Generator.Providers;
13+
using Microsoft.TypeSpec.Generator.Snippets;
14+
using Microsoft.TypeSpec.Generator.Statements;
1215
using System;
1316
using System.Collections.Generic;
1417
using System.Diagnostics.CodeAnalysis;
18+
using System.Linq;
1519

1620
namespace Azure.Generator.Management.Visitors;
1721

@@ -169,6 +173,39 @@ private void DoPreVisitPropertyForUrlPropertyName(InputProperty property, Proper
169173
return base.VisitMethod(method);
170174
}
171175

176+
// TODO: we will remove this manual updated when https://github.com/microsoft/typespec/issues/8079 is resolved
177+
protected override MethodBodyStatement? VisitExpressionStatement(ExpressionStatement statement, MethodProvider method)
178+
{
179+
if (method.EnclosingType is MrwSerializationTypeDefinition serializationTypeDefinition
180+
&& _deserializationRename.TryGetValue(serializationTypeDefinition, out var newName)
181+
&& method.Signature.Name == "JsonModelCreateCore"
182+
&& statement.Expression is KeywordExpression keyword && keyword.Keyword == "return"
183+
&& keyword.Expression is InvokeMethodExpression invokeMethod)
184+
{
185+
invokeMethod.Update(methodName: newName);
186+
}
187+
return base.VisitExpressionStatement(statement, method);
188+
}
189+
190+
// TODO: we will remove this manual updated when https://github.com/microsoft/typespec/issues/8079 is resolved
191+
protected override SwitchCaseStatement? VisitSwitchCaseStatement(SwitchCaseStatement statement, MethodProvider method)
192+
{
193+
if (method.EnclosingType is MrwSerializationTypeDefinition serializationTypeDefinition
194+
&& _deserializationRename.TryGetValue(serializationTypeDefinition, out var newName)
195+
&& method.Signature.Name == "PersistableModelCreateCore")
196+
{
197+
if (statement.Statement.AsStatement().FirstOrDefault() is UsingScopeStatement usingScopeStatement
198+
&& usingScopeStatement.Body.AsStatement().FirstOrDefault() is ExpressionStatement expression
199+
&& expression.Expression is KeywordExpression keywordExpression
200+
&& keywordExpression.Keyword == "return"
201+
&& keywordExpression.Expression is InvokeMethodExpression invokeMethod)
202+
{
203+
invokeMethod.Update(methodName: newName);
204+
}
205+
}
206+
return base.VisitSwitchCaseStatement(statement, method);
207+
}
208+
172209
private bool TryTransformUrlToUri(string name, [MaybeNullWhen(false)] out string newName)
173210
{
174211
const char i = 'i';

eng/packages/http-client-csharp-mgmt/generator/Azure.Generator.Management/src/Visitors/SerializationVisitor.cs

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,22 @@ internal class SerializationVisitor : ScmLibraryVisitor
1414
internal const string FromResponseMethodName = "FromResponse";
1515

1616
/// <inheritdoc/>
17-
protected override TypeProvider? VisitType(TypeProvider type)
17+
protected override MethodProvider? VisitMethod(MethodProvider method)
1818
{
19-
if (type is MrwSerializationTypeDefinition serializationTypeDefinition)
19+
if (method.EnclosingType is MrwSerializationTypeDefinition && method.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Operator))
2020
{
21-
foreach (var method in serializationTypeDefinition.Methods)
21+
var modifiers = method.Signature.Modifiers & ~MethodSignatureModifiers.Operator & ~MethodSignatureModifiers.Public | MethodSignatureModifiers.Internal;
22+
if (modifiers.HasFlag(MethodSignatureModifiers.Implicit))
2223
{
23-
if (method.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Operator))
24-
{
25-
var modifiers = method.Signature.Modifiers & ~MethodSignatureModifiers.Operator & ~MethodSignatureModifiers.Public | MethodSignatureModifiers.Internal;
26-
if (modifiers.HasFlag(MethodSignatureModifiers.Implicit))
27-
{
28-
modifiers &= ~MethodSignatureModifiers.Implicit;
29-
method.Signature.Update(modifiers: modifiers, name: ToRequestContentMethodName);
30-
}
31-
else if (modifiers.HasFlag(MethodSignatureModifiers.Explicit))
32-
{
33-
modifiers &= ~MethodSignatureModifiers.Explicit;
34-
method.Signature.Update(modifiers: modifiers, name: FromResponseMethodName);
35-
}
36-
}
24+
modifiers &= ~MethodSignatureModifiers.Implicit;
25+
method.Signature.Update(modifiers: modifiers, name: ToRequestContentMethodName);
26+
}
27+
else if (modifiers.HasFlag(MethodSignatureModifiers.Explicit))
28+
{
29+
modifiers &= ~MethodSignatureModifiers.Explicit;
30+
method.Signature.Update(modifiers: modifiers, name: FromResponseMethodName);
3731
}
38-
return type;
3932
}
40-
return base.VisitType(type);
33+
return base.VisitMethod(method);
4134
}
4235
}

eng/packages/http-client-csharp-mgmt/generator/Azure.Generator.Management/test/NameVisitorTests.cs

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ public void TestTransformUrlToUri()
3434
decorators: []);
3535

3636
var plugin = ManagementMockHelpers.LoadMockPlugin(inputModels: () => [model], clients: () => [client]);
37-
var visitor = new TestVisitor();
37+
38+
// PreVisitModel is called during the model creation
3839
var type = plugin.Object.TypeFactory.CreateModel(model);
39-
var transformedModel = visitor.InvokeVisit(model, type);
40-
Assert.That(transformedModel?.Name, Is.EqualTo(TestModelName.Replace("Url", "Uri")));
41-
Assert.That(transformedModel?.Properties[0].Name, Is.EqualTo(TestProtyName.Replace("Url", "Uri")));
40+
Assert.That(type?.Name, Is.EqualTo(TestModelName.Replace("Url", "Uri")));
41+
Assert.That(type?.Properties[0].Name, Is.EqualTo(TestProtyName.Replace("Url", "Uri")));
4242
}
4343

4444
[Test]
@@ -58,26 +58,18 @@ public void TestPrependResourceProviderName()
5858
decorators: []);
5959

6060
var plugin = ManagementMockHelpers.LoadMockPlugin(inputModels: () => [model], clients: () => [client]);
61-
var visitor = new TestVisitor();
61+
62+
// PreVisitModel is called during the model creation
6263
var type = plugin.Object.TypeFactory.CreateModel(model);
63-
var transformedModel = visitor.InvokeVisit(model, type);
6464
var resourceProviderName = ManagementClientGenerator.Instance.TypeFactory.ResourceProviderName;
6565
var updatedSkuModelName = $"{resourceProviderName}{skuModelName}";
66-
Assert.AreEqual(transformedModel?.Name, updatedSkuModelName);
67-
Assert.AreEqual(transformedModel!.Constructors[0].Signature.Name, $"{resourceProviderName}{skuModelName}");
68-
var serializationProvider = transformedModel?.SerializationProviders.SingleOrDefault();
66+
Assert.AreEqual(type?.Name, updatedSkuModelName);
67+
Assert.AreEqual(type!.Constructors[0].Signature.Name, $"{resourceProviderName}{skuModelName}");
68+
var serializationProvider = type?.SerializationProviders.SingleOrDefault();
6969
Assert.NotNull(serializationProvider);
7070
Assert.AreEqual(serializationProvider!.Name, updatedSkuModelName);
71-
var deserializationMethod = serializationProvider.Methods.SingleOrDefault(m => m.Signature.Name.Equals($"Deserialize{updatedSkuModelName}"));
72-
Assert.NotNull(deserializationMethod);
73-
}
74-
75-
private class TestVisitor : NameVisitor
76-
{
77-
public ModelProvider? InvokeVisit(InputModelType model, ModelProvider? type)
78-
{
79-
return base.PreVisitModel(model, type);
80-
}
71+
var deserializationMethod = serializationProvider.Methods.SingleOrDefault(m => m.Signature.Name.StartsWith("Deserialize"));
72+
Assert.AreEqual("DeserializeSamplesSku", deserializationMethod!.Signature.Name);
8173
}
8274
}
8375
}

0 commit comments

Comments
 (0)