Skip to content

Commit 985a084

Browse files
authored
Fix to use custom code to update a property type (#54158)
* wip * bump version of azure generator
1 parent c960d54 commit 985a084

32 files changed

+145
-179
lines changed

eng/Packages.Data.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,6 @@
487487
<PropertyGroup>
488488
<TestProxyVersion>1.0.0-dev.20250930.1</TestProxyVersion>
489489
<UnbrandedGeneratorVersion>1.0.0-alpha.20251125.2</UnbrandedGeneratorVersion>
490-
<AzureGeneratorVersion>1.0.0-alpha.20251114.1</AzureGeneratorVersion>
490+
<AzureGeneratorVersion>1.0.0-alpha.20251125.3</AzureGeneratorVersion>
491491
</PropertyGroup>
492492
</Project>

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ public static IReadOnlyList<PropertyProvider> GetAllProperties(ModelProvider pro
3131
while (baseTypes.TryPop(out var item))
3232
{
3333
result.AddRange(item.Properties);
34+
result.AddRange(item.CustomCodeView?.Properties ?? []);
3435
}
3536
result.AddRange(propertyModelProvider.Properties);
37+
result.AddRange(propertyModelProvider.CustomCodeView?.Properties ?? []);
3638
return result;
3739
}
3840

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

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ private void FlattenModel(ModelProvider model)
305305
var isFlattenProperty = false;
306306
var isSafeFlatten = false;
307307
var propertyMap = new Dictionary<PropertyProvider, List<FlattenPropertyInfo>>();
308-
foreach (var internalProperty in model.Properties)
308+
foreach (var internalProperty in model.Properties.Concat(model.CustomCodeView?.Properties ?? []))
309309
{
310310
// we need to flatten the inner property type first
311311
var propertyType = internalProperty.Type;
@@ -315,16 +315,24 @@ private void FlattenModel(ModelProvider model)
315315
FlattenModel(propertyModel);
316316
}
317317

318+
if (!(ManagementClientGenerator.Instance.TypeFactory.CSharpTypeMap.TryGetValue(internalProperty.Type, out var typeProvider)
319+
&& typeProvider is ModelProvider modelProvider))
320+
{
321+
continue;
322+
}
323+
324+
var innerProperties = PropertyHelpers.GetAllProperties(modelProvider);
325+
318326
// handle `@flattenProperty`
319327
if (ManagementClientGenerator.Instance.OutputLibrary.OutputFlattenPropertyMap.TryGetValue(model, out var propertiesToFlatten) && propertiesToFlatten.Contains(internalProperty))
320328
{
321-
isFlattenProperty = PropertyFlatten(model, propertyMap, internalProperty);
329+
isFlattenProperty = true;
330+
PropertyFlatten(model, modelProvider, innerProperties, propertyMap, internalProperty);
322331
continue;
323332
}
324333
// safe flatten single property
325-
else if (ManagementClientGenerator.Instance.TypeFactory.CSharpTypeMap.TryGetValue(internalProperty.Type, out var typeProvider) && typeProvider is ModelProvider modelProvider)
334+
else
326335
{
327-
var innerProperties = PropertyHelpers.GetAllProperties(modelProvider);
328336
// only safe flatten single property
329337
if (innerProperties.Count != 1)
330338
{
@@ -344,7 +352,7 @@ private void FlattenModel(ModelProvider model)
344352
continue;
345353
}
346354

347-
isSafeFlatten = SafeFlatten(model, propertyMap, internalProperty, modelProvider);
355+
isSafeFlatten = SafeFlatten(model, innerProperties, propertyMap, internalProperty, modelProvider);
348356
}
349357
}
350358

@@ -364,61 +372,53 @@ private void FlattenModel(ModelProvider model)
364372
}
365373
}
366374

367-
private bool PropertyFlatten(ModelProvider model, Dictionary<PropertyProvider, List<FlattenPropertyInfo>> propertyMap, PropertyProvider internalProperty)
375+
private void PropertyFlatten(ModelProvider model, ModelProvider propertyModel, IReadOnlyList<PropertyProvider> innerProperties, Dictionary<PropertyProvider, List<FlattenPropertyInfo>> propertyMap, PropertyProvider internalProperty)
368376
{
369-
var isFlattened = false;
370377
var flattenedProperties = new List<(bool IsOverriddenValueType, PropertyProvider FlattenedProperty)>();
371-
if (ManagementClientGenerator.Instance.TypeFactory.CSharpTypeMap.TryGetValue(internalProperty.Type, out var typeProvider)
372-
&& typeProvider is ModelProvider modelProvider)
373-
{
374-
isFlattened = true;
375378

376-
foreach (var innerProperty in PropertyHelpers.GetAllProperties(modelProvider))
379+
foreach (var innerProperty in innerProperties)
380+
{
381+
if (!innerProperty.Modifiers.HasFlag(MethodSignatureModifiers.Public))
377382
{
378-
if (!innerProperty.Modifiers.HasFlag(MethodSignatureModifiers.Public))
379-
{
380-
continue;
381-
}
382-
UpdateFlattenTypeCollectionProperty(internalProperty, innerProperty, model);
383-
// flatten the property to public and associate it with the internal property
384-
var (_, includeGetterNullCheck, _) = PropertyHelpers.GetFlags(internalProperty, innerProperty);
385-
var flattenPropertyName = innerProperty.Name; // TODO: handle name conflicts
386-
var flattenPropertyBody = new MethodPropertyBody(
387-
PropertyHelpers.BuildGetter(includeGetterNullCheck, internalProperty, modelProvider, innerProperty),
388-
!internalProperty.Body.HasSetter || !innerProperty.Body.HasSetter ? null : PropertyHelpers.BuildSetterForPropertyFlatten(modelProvider, internalProperty, innerProperty)
389-
);
390-
391-
// If the inner property is a value type, we need to ensure that we handle the nullability correctly.
392-
var isOverriddenValueType = innerProperty.Type.IsValueType && !innerProperty.Type.IsNullable;
393-
var flattenedProperty =
394-
new FlattenedPropertyProvider(
395-
innerProperty.Description,
396-
innerProperty.Modifiers,
397-
innerProperty.Type,
398-
flattenPropertyName,
399-
flattenPropertyBody,
400-
model,
401-
internalProperty,
402-
innerProperty,
403-
innerProperty.ExplicitInterface,
404-
ConstructFlattenPropertyWireInfo(internalProperty, innerProperty),
405-
innerProperty.IsRef,
406-
innerProperty.Attributes);
407-
408-
if (propertyMap.TryGetValue(internalProperty, out var value))
409-
{
410-
value.Add(new(flattenedProperty, internalProperty));
411-
}
412-
else
413-
{
414-
propertyMap.Add(internalProperty, new List<FlattenPropertyInfo> { new(flattenedProperty, internalProperty) });
415-
}
383+
continue;
384+
}
385+
UpdateFlattenTypeCollectionProperty(internalProperty, innerProperty, model);
386+
// flatten the property to public and associate it with the internal property
387+
var (_, includeGetterNullCheck, _) = PropertyHelpers.GetFlags(internalProperty, innerProperty);
388+
var flattenPropertyName = innerProperty.Name; // TODO: handle name conflicts
389+
var flattenPropertyBody = new MethodPropertyBody(
390+
PropertyHelpers.BuildGetter(includeGetterNullCheck, internalProperty, propertyModel, innerProperty),
391+
!internalProperty.Body.HasSetter || !innerProperty.Body.HasSetter ? null : PropertyHelpers.BuildSetterForPropertyFlatten(propertyModel, internalProperty, innerProperty)
392+
);
393+
394+
// If the inner property is a value type, we need to ensure that we handle the nullability correctly.
395+
var isOverriddenValueType = innerProperty.Type.IsValueType && !innerProperty.Type.IsNullable;
396+
var flattenedProperty =
397+
new FlattenedPropertyProvider(
398+
innerProperty.Description,
399+
innerProperty.Modifiers,
400+
innerProperty.Type,
401+
flattenPropertyName,
402+
flattenPropertyBody,
403+
model,
404+
internalProperty,
405+
innerProperty,
406+
innerProperty.ExplicitInterface,
407+
ConstructFlattenPropertyWireInfo(internalProperty, innerProperty),
408+
innerProperty.IsRef,
409+
innerProperty.Attributes);
410+
411+
if (propertyMap.TryGetValue(internalProperty, out var value))
412+
{
413+
value.Add(new(flattenedProperty, internalProperty));
414+
}
415+
else
416+
{
417+
propertyMap.Add(internalProperty, new List<FlattenPropertyInfo> { new(flattenedProperty, internalProperty) });
416418
}
417-
// make the internalized properties internal
418-
internalProperty.Update(modifiers: internalProperty.Modifiers & ~MethodSignatureModifiers.Public | MethodSignatureModifiers.Internal);
419419
}
420-
421-
return isFlattened;
420+
// make the internalized properties internal
421+
internalProperty.Update(modifiers: internalProperty.Modifiers & ~MethodSignatureModifiers.Public | MethodSignatureModifiers.Internal);
422422
}
423423

424424
private static PropertyWireInformation? ConstructFlattenPropertyWireInfo(PropertyProvider internalProperty, PropertyProvider innerProperty)
@@ -438,10 +438,10 @@ private bool PropertyFlatten(ModelProvider model, Dictionary<PropertyProvider, L
438438
innerPropertyWireInfo.IsHttpMetadata);
439439
}
440440

441-
private bool SafeFlatten(ModelProvider model, Dictionary<PropertyProvider, List<FlattenPropertyInfo>> propertyMap, PropertyProvider internalProperty, ModelProvider modelProvider)
441+
private bool SafeFlatten(ModelProvider model, IReadOnlyList<PropertyProvider> innerProperties, Dictionary<PropertyProvider, List<FlattenPropertyInfo>> propertyMap, PropertyProvider internalProperty, ModelProvider modelProvider)
442442
{
443443
bool isFlattened;
444-
var innerProperty = modelProvider.Properties.Single();
444+
var innerProperty = innerProperties.Single();
445445
isFlattened = true;
446446

447447
// flatten the single property to public and associate it with the internal property
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
namespace Azure.Generator.MgmtTypeSpec.Tests.Models
5+
{
6+
internal partial class BarQuotaProperties
7+
{
8+
/// <summary> enabled. </summary>
9+
[WirePath("left")]
10+
public string Left { get; set; }
11+
}
12+
}

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/BarQuotaResourceData.cs

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/BarSettingsResourceData.cs

Lines changed: 9 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/CollectionResults/BarsGetAllAsyncCollectionResultOfT.cs

Lines changed: 1 addition & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

eng/packages/http-client-csharp-mgmt/generator/TestProjects/Local/Mgmt-TypeSpec/src/Generated/CollectionResults/BarsGetAllCollectionResultOfT.cs

Lines changed: 1 addition & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)