@@ -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
0 commit comments