Skip to content

Commit f6016b6

Browse files
authored
Split system object type (Azure#51595)
* wip * Create SystemObjectModelTypeProvider and make InheritableSystemObjectModelProvider a subtype of it
1 parent 789e61d commit f6016b6

File tree

7 files changed

+58
-31
lines changed

7 files changed

+58
-31
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ protected override void Configure()
5252
AddMetadataReference(MetadataReference.CreateFromFile(typeof(ArmClient).Assembly.Location));
5353
AddVisitor(new RestClientVisitor());
5454
AddVisitor(new ResourceVisitor());
55-
AddVisitor(new InheritableSystemObjectModelVisitor());
55+
AddVisitor(new SystemObjectModelVisitor());
5656
AddVisitor(new NameVisitor());
5757
AddVisitor(new TypeFilterVisitor());
5858
AddVisitor(new SerializationVisitor());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ protected override TypeProvider[] BuildTypeProviders()
184184
var extensions = BuildExtensions(resources);
185185

186186
return [
187-
.. base.BuildTypeProviders().Where(t => t is not InheritableSystemObjectModelProvider),
187+
.. base.BuildTypeProviders().Where(t => t is not SystemObjectModelProvider),
188188
ArmOperation,
189189
GenericArmOperation,
190190
.. resources,

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,12 @@ private string BuildResourceProviderName()
6767
/// <inheritdoc/>
6868
protected override CSharpType? CreateCSharpTypeCore(InputType inputType)
6969
{
70-
if (inputType is InputModelType model && KnownManagementTypes.TryGetManagementType(model.CrossLanguageDefinitionId, out var replacedType))
70+
if (inputType is InputModelType model && (KnownManagementTypes.TryGetInheritableSystemType(model.CrossLanguageDefinitionId, out var replacedType) || KnownManagementTypes.TryGetSystemType(model.CrossLanguageDefinitionId, out replacedType)))
7171
{
7272
return replacedType;
7373
}
74-
else if (inputType is InputPrimitiveType primitiveType && KnownManagementTypes.TryGetPrimitiveType(primitiveType.CrossLanguageDefinitionId, out var csharpType))
74+
75+
if (inputType is InputPrimitiveType primitiveType && KnownManagementTypes.TryGetPrimitiveType(primitiveType.CrossLanguageDefinitionId, out var csharpType))
7576
{
7677
return csharpType;
7778
}
@@ -81,10 +82,15 @@ private string BuildResourceProviderName()
8182
/// <inheritdoc/>
8283
protected override ModelProvider? CreateModelCore(InputModelType model)
8384
{
84-
if (KnownManagementTypes.TryGetManagementType(model.CrossLanguageDefinitionId, out var replacedType))
85+
if (KnownManagementTypes.TryGetInheritableSystemType(model.CrossLanguageDefinitionId, out var replacedType))
8586
{
8687
return new InheritableSystemObjectModelProvider(replacedType.FrameworkType, model);
8788
}
89+
90+
if (KnownManagementTypes.TryGetSystemType(model.CrossLanguageDefinitionId, out replacedType))
91+
{
92+
return new SystemObjectModelProvider(replacedType.FrameworkType, model);
93+
}
8894
return base.CreateModelCore(model);
8995
}
9096

eng/packages/http-client-csharp-mgmt/generator/Azure.Generator.Management/src/Primitives/KnownManagementTypes.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,21 @@ internal class KnownManagementTypes
2828
public delegate MethodBodyStatement SerializationExpression(ValueExpression value, ScopedApi<Utf8JsonWriter> writer, ScopedApi<ModelReaderWriterOptions> options, SerializationFormat format);
2929
public delegate ValueExpression DeserializationExpression(CSharpType valueType, ScopedApi<JsonElement> element, SerializationFormat format);
3030

31-
private static readonly IReadOnlyDictionary<string, CSharpType> _idToTypeMap = new Dictionary<string, CSharpType>()
31+
private static readonly IReadOnlyDictionary<string, CSharpType> _idToInheritableSystemTypeMap = new Dictionary<string, CSharpType>()
32+
{
33+
["Azure.ResourceManager.CommonTypes.ProxyResource"] = typeof(ResourceData),
34+
["Azure.ResourceManager.CommonTypes.Resource"] = typeof(ResourceData),
35+
["Azure.ResourceManager.CommonTypes.TrackedResource"] = typeof(TrackedResourceData),
36+
};
37+
38+
private static readonly IReadOnlyDictionary<string, CSharpType> _idToSystemTypeMap = new Dictionary<string, CSharpType>()
3239
{
3340
["Azure.ResourceManager.CommonTypes.ExtendedLocation"] = typeof(ExtendedLocation),
3441
["Azure.ResourceManager.CommonTypes.ExtendedLocationType"] = typeof(ExtendedLocationType),
3542
["Azure.ResourceManager.CommonTypes.ManagedServiceIdentity"] = typeof(ManagedServiceIdentity),
3643
["Azure.ResourceManager.CommonTypes.ManagedServiceIdentityType"] = typeof(ManagedServiceIdentityType),
3744
["Azure.ResourceManager.CommonTypes.OperationStatusResult"] = typeof(OperationStatusResult),
38-
["Azure.ResourceManager.CommonTypes.ProxyResource"] = typeof(ResourceData),
39-
["Azure.ResourceManager.CommonTypes.Resource"] = typeof(ResourceData),
4045
["Azure.ResourceManager.CommonTypes.SystemData"] = typeof(SystemData),
41-
["Azure.ResourceManager.CommonTypes.TrackedResource"] = typeof(TrackedResourceData),
4246
["Azure.ResourceManager.CommonTypes.UserAssignedIdentity"] = typeof(UserAssignedIdentity),
4347
};
4448

@@ -66,11 +70,13 @@ private static ValueExpression DeserializeNewInstanceStringLikeType(CSharpType v
6670
[typeof(ResourceType)] = DeserializeNewInstanceStringLikeType,
6771
};
6872

69-
private static readonly HashSet<CSharpType> _knownTypes = _idToTypeMap.Values.ToHashSet(new CSharpFullNameComparer());
73+
private static readonly HashSet<CSharpType> _knownTypes = _idToInheritableSystemTypeMap.Values.Concat(_idToSystemTypeMap.Values).ToHashSet(new CSharpFullNameComparer());
7074

7175
public static bool IsKnownManagementType(CSharpType type) => _knownTypes.Contains(type);
7276

73-
public static bool TryGetManagementType(string id, [MaybeNullWhen(false)] out CSharpType type) => _idToTypeMap.TryGetValue(id, out type);
77+
public static bool TryGetInheritableSystemType(string id, [MaybeNullWhen(false)] out CSharpType type) => _idToInheritableSystemTypeMap.TryGetValue(id, out type);
78+
79+
public static bool TryGetSystemType(string id, [MaybeNullWhen(false)] out CSharpType type) => _idToSystemTypeMap.TryGetValue(id, out type);
7480

7581
// The comparison could be CSharpType from Azure.ResourceManager, which is a framework type
7682
// and CSharpType from InheritableSystemObjectModelProvider, which is not a framework type, they should still be equal if namespace and name match

eng/packages/http-client-csharp-mgmt/generator/Azure.Generator.Management/src/Providers/InheritableSystemObjectModelProvider.cs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,14 @@
22
// Licensed under the MIT License.
33

44
using Microsoft.TypeSpec.Generator.Input;
5-
using Microsoft.TypeSpec.Generator.Providers;
65
using System;
76

87
namespace Azure.Generator.Management.Providers
98
{
10-
internal class InheritableSystemObjectModelProvider : ModelProvider
9+
internal class InheritableSystemObjectModelProvider : SystemObjectModelProvider
1110
{
12-
internal readonly Type _type;
13-
14-
public InheritableSystemObjectModelProvider(Type type, InputModelType inputModel) : base(inputModel)
11+
public InheritableSystemObjectModelProvider(Type type, InputModelType inputModel) : base(type, inputModel)
1512
{
16-
_type = type;
17-
CrossLanguageDefinitionId = inputModel.CrossLanguageDefinitionId;
1813
}
19-
20-
internal string CrossLanguageDefinitionId { get; }
21-
22-
protected override string BuildName() => _type.Name;
23-
24-
protected override string BuildRelativeFilePath()
25-
=> throw new InvalidOperationException("This type should not be writing in generation");
26-
27-
protected override string BuildNamespace() => _type.Namespace!;
2814
}
2915
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using Microsoft.TypeSpec.Generator.Input;
5+
using Microsoft.TypeSpec.Generator.Providers;
6+
using System;
7+
8+
namespace Azure.Generator.Management.Providers
9+
{
10+
internal class SystemObjectModelProvider : ModelProvider
11+
{
12+
internal readonly Type _type;
13+
14+
public SystemObjectModelProvider(Type type, InputModelType inputModel) : base(inputModel)
15+
{
16+
_type = type;
17+
CrossLanguageDefinitionId = inputModel.CrossLanguageDefinitionId;
18+
}
19+
20+
internal string CrossLanguageDefinitionId { get; }
21+
22+
protected override string BuildName() => _type.Name;
23+
24+
protected override string BuildRelativeFilePath()
25+
=> throw new InvalidOperationException("This type should not be writing in generation");
26+
27+
protected override string BuildNamespace() => _type.Namespace!;
28+
}
29+
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818

1919
namespace Azure.Generator.Management.Visitors;
2020

21-
internal class InheritableSystemObjectModelVisitor : ScmLibraryVisitor
21+
internal class SystemObjectModelVisitor : ScmLibraryVisitor
2222
{
2323
protected override ModelProvider? PreVisitModel(InputModelType model, ModelProvider? type)
2424
{
25-
if (type is InheritableSystemObjectModelProvider systemType)
25+
if (type is SystemObjectModelProvider systemType)
2626
{
2727
UpdateNamespace(systemType);
2828
}
@@ -41,7 +41,7 @@ internal class InheritableSystemObjectModelVisitor : ScmLibraryVisitor
4141
UpdateModelFactory(modelFactory);
4242
}
4343

44-
if (type is InheritableSystemObjectModelProvider systemType)
44+
if (type is SystemObjectModelProvider systemType)
4545
{
4646
UpdateNamespace(systemType);
4747
}
@@ -68,7 +68,7 @@ private static void UpdateModelFactory(ModelFactoryProvider modelFactory)
6868
modelFactory.Update(methods: methods);
6969
}
7070

71-
private static void UpdateNamespace(InheritableSystemObjectModelProvider systemType)
71+
private static void UpdateNamespace(SystemObjectModelProvider systemType)
7272
{
7373
// This is needed because we updated the namespace with NamespaceVisitor in Azure generator earlier
7474
systemType.Update(@namespace: systemType._type.Namespace);

0 commit comments

Comments
 (0)