Skip to content

Commit b4c1bbb

Browse files
live1206Copilot
andcommitted
fix(http-client-csharp): cache MRW serialization checks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent d0c358f commit b4c1bbb

1 file changed

Lines changed: 19 additions & 13 deletions

File tree

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/MrwSerializationTypeDefinition.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,12 @@ public partial class MrwSerializationTypeDefinition : TypeProvider
5757
// CSharpType before delayed base model resolution has updated the model's inheritance.
5858
private CSharpType? _jsonModelTInterfaceValue;
5959
private CSharpType _jsonModelTInterface => _jsonModelTInterfaceValue ??= new CSharpType(typeof(IJsonModel<>), SerializationInterfaceType.Type);
60-
private CSharpType? _jsonModelObjectInterface => _isStruct ? (CSharpType)typeof(IJsonModel<object>) : null;
60+
private CSharpType? _jsonModelObjectInterface;
61+
private CSharpType? JsonModelObjectInterface => _isStruct ? _jsonModelObjectInterface ??= (CSharpType)typeof(IJsonModel<object>) : null;
6162
private CSharpType? _persistableModelTInterfaceValue;
6263
private CSharpType _persistableModelTInterface => _persistableModelTInterfaceValue ??= new CSharpType(typeof(IPersistableModel<>), SerializationInterfaceType.Type);
63-
private CSharpType? _persistableModelObjectInterface => _isStruct ? (CSharpType)typeof(IPersistableModel<object>) : null;
64+
private CSharpType? _persistableModelObjectInterface;
65+
private CSharpType? PersistableModelObjectInterface => _isStruct ? _persistableModelObjectInterface ??= (CSharpType)typeof(IPersistableModel<object>) : null;
6466
private readonly ModelProvider _model;
6567
private readonly InputModelType _inputModel;
6668
private readonly FieldProvider? _rawDataField;
@@ -71,8 +73,10 @@ public partial class MrwSerializationTypeDefinition : TypeProvider
7173
private readonly bool _supportsXml;
7274
private ConstructorProvider? _serializationConstructor;
7375
// Flag to determine if the model should override the serialization methods
74-
private bool ShouldOverrideMethods => _model.BaseModelProvider != null && !_isStruct;
75-
private bool ShouldSkipSerializationMethodOverrides => ShouldSkipDerivedSerializationMethodOverrides(_model.BaseModelProvider);
76+
private bool? _shouldOverrideMethods;
77+
private bool ShouldOverrideMethods => _shouldOverrideMethods ??= _model.BaseModelProvider != null && !_isStruct;
78+
private bool? _shouldSkipSerializationMethodOverrides;
79+
private bool ShouldSkipSerializationMethodOverrides => _shouldSkipSerializationMethodOverrides ??= ShouldSkipDerivedSerializationMethodOverrides(_model.BaseModelProvider);
7680
private readonly bool _shouldOverrideXmlMethods;
7781
private readonly Lazy<PropertyProvider[]> _additionalProperties;
7882

@@ -434,17 +438,19 @@ protected override CSharpType[] BuildImplements()
434438
if (_supportsJson)
435439
{
436440
interfaces.Add(_jsonModelTInterface);
437-
if (_jsonModelObjectInterface != null)
441+
var jsonModelObjectInterface = JsonModelObjectInterface;
442+
if (jsonModelObjectInterface != null)
438443
{
439-
interfaces.Add(_jsonModelObjectInterface);
444+
interfaces.Add(jsonModelObjectInterface);
440445
}
441446
}
442447
else if (_supportsXml)
443448
{
444449
interfaces.Add(_persistableModelTInterface);
445-
if (_persistableModelObjectInterface != null)
450+
var persistableModelObjectInterface = PersistableModelObjectInterface;
451+
if (persistableModelObjectInterface != null)
446452
{
447-
interfaces.Add(_persistableModelObjectInterface);
453+
interfaces.Add(persistableModelObjectInterface);
448454
}
449455
}
450456

@@ -474,7 +480,7 @@ internal MethodProvider BuildJsonModelWriteMethodObjectDeclaration()
474480
var castToT = This.CastTo(_jsonModelTInterface);
475481
return new MethodProvider
476482
(
477-
new MethodSignature(nameof(IJsonModel<object>.Write), null, MethodSignatureModifiers.None, null, null, [_utf8JsonWriterParameter, _serializationOptionsParameter], ExplicitInterface: _jsonModelObjectInterface),
483+
new MethodSignature(nameof(IJsonModel<object>.Write), null, MethodSignatureModifiers.None, null, null, [_utf8JsonWriterParameter, _serializationOptionsParameter], ExplicitInterface: JsonModelObjectInterface),
478484
castToT.Invoke(nameof(IJsonModel<object>.Write), [_utf8JsonWriterParameter, _serializationOptionsParameter]),
479485
this
480486
);
@@ -489,7 +495,7 @@ internal MethodProvider BuildJsonModelCreateMethodObjectDeclaration()
489495
var castToT = This.CastTo(_jsonModelTInterface);
490496
return new MethodProvider
491497
(
492-
new MethodSignature(nameof(IJsonModel<object>.Create), null, MethodSignatureModifiers.None, typeof(object), null, [_utf8JsonReaderParameter, _serializationOptionsParameter], ExplicitInterface: _jsonModelObjectInterface),
498+
new MethodSignature(nameof(IJsonModel<object>.Create), null, MethodSignatureModifiers.None, typeof(object), null, [_utf8JsonReaderParameter, _serializationOptionsParameter], ExplicitInterface: JsonModelObjectInterface),
493499
castToT.Invoke(nameof(IJsonModel<object>.Create), [_utf8JsonReaderParameter.AsArgument(), _serializationOptionsParameter]),
494500
this
495501
);
@@ -505,7 +511,7 @@ internal MethodProvider BuildPersistableModelWriteMethodObjectDeclaration()
505511
var returnType = typeof(BinaryData);
506512
return new MethodProvider
507513
(
508-
new MethodSignature(nameof(IPersistableModel<object>.Write), null, MethodSignatureModifiers.None, returnType, null, [_serializationOptionsParameter], ExplicitInterface: _persistableModelObjectInterface),
514+
new MethodSignature(nameof(IPersistableModel<object>.Write), null, MethodSignatureModifiers.None, returnType, null, [_serializationOptionsParameter], ExplicitInterface: PersistableModelObjectInterface),
509515
castToT.Invoke(nameof(IPersistableModel<object>.Write), [_serializationOptionsParameter]),
510516
this
511517
);
@@ -521,7 +527,7 @@ internal MethodProvider BuildPersistableModelCreateMethodObjectDeclaration()
521527
var returnType = typeof(object);
522528
return new MethodProvider
523529
(
524-
new MethodSignature(nameof(IPersistableModel<object>.Create), null, MethodSignatureModifiers.None, returnType, null, [_dataParameter, _serializationOptionsParameter], ExplicitInterface: _persistableModelObjectInterface),
530+
new MethodSignature(nameof(IPersistableModel<object>.Create), null, MethodSignatureModifiers.None, returnType, null, [_dataParameter, _serializationOptionsParameter], ExplicitInterface: PersistableModelObjectInterface),
525531
castToT.Invoke(nameof(IPersistableModel<object>.Create), [_dataParameter, _serializationOptionsParameter]),
526532
this
527533
);
@@ -801,7 +807,7 @@ internal MethodProvider BuildPersistableModelGetFormatFromOptionsObjectDeclarati
801807
// string IPersistableModel<object>.GetFormatFromOptions(ModelReaderWriterOptions options) => ((IPersistableModel<T>)this).GetFormatFromOptions(options);
802808
return new MethodProvider
803809
(
804-
new MethodSignature(nameof(IPersistableModel<object>.GetFormatFromOptions), null, MethodSignatureModifiers.None, typeof(string), null, [_serializationOptionsParameter], ExplicitInterface: _persistableModelObjectInterface),
810+
new MethodSignature(nameof(IPersistableModel<object>.GetFormatFromOptions), null, MethodSignatureModifiers.None, typeof(string), null, [_serializationOptionsParameter], ExplicitInterface: PersistableModelObjectInterface),
805811
castToT.Invoke(nameof(IPersistableModel<object>.GetFormatFromOptions), [_serializationOptionsParameter]),
806812
this
807813
);

0 commit comments

Comments
 (0)