diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index 81985cb12..236aa23f6 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -70,11 +70,13 @@ internal OpenApiCallbackReference(OpenApiCallback target, string referenceId) }; } + private Dictionary _pathItems; /// - public override Dictionary PathItems { get => Target.PathItems; set => Target.PathItems = value; } + public override Dictionary PathItems { get => _pathItems is not null ? _pathItems : Target?.PathItems; set => _pathItems = value; } + private IDictionary _extensions; /// - public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + public override IDictionary Extensions { get => _extensions is not null ? _extensions : Target?.Extensions; set => _extensions = value; } /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index c36c43d9a..68624bf56 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -30,10 +30,9 @@ public OpenApiExample Target get { _target ??= Reference.HostDocument.ResolveReferenceTo(_reference); - OpenApiExample resolved = new OpenApiExample(_target); - if (!string.IsNullOrEmpty(_description)) resolved.Description = _description; - if (!string.IsNullOrEmpty(_summary)) resolved.Summary = _summary; - return resolved; + if (!string.IsNullOrEmpty(_description)) _target.Description = _description; + if (!string.IsNullOrEmpty(_summary)) _target.Summary = _summary; + return _target; } } @@ -76,25 +75,28 @@ internal OpenApiExampleReference(OpenApiExample target, string referenceId) /// public override string Description { - get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + get => string.IsNullOrEmpty(_description) ? Target?.Description : _description; set => _description = value; } /// public override string Summary { - get => string.IsNullOrEmpty(_summary) ? Target.Summary : _summary; + get => string.IsNullOrEmpty(_summary) ? Target?.Summary : _summary; set => _summary = value; } + private IDictionary _extensions; /// - public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + public override IDictionary Extensions { get => _extensions is not null ? _extensions : Target?.Extensions; set => _extensions = value; } + private string _externalValue; /// - public override string ExternalValue { get => Target.ExternalValue; set => Target.ExternalValue = value; } + public override string ExternalValue { get => !string.IsNullOrEmpty(_externalValue) ? _externalValue : Target?.ExternalValue; set => _externalValue = value; } + private JsonNode _value; /// - public override JsonNode Value { get => Target.Value; set => Target.Value = value; } + public override JsonNode Value { get => _value is not null ? _value : Target?.Value; set => _value = value; } /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index e8275c23c..328ecdbd5 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -29,9 +29,8 @@ public OpenApiHeader Target get { _target ??= Reference.HostDocument.ResolveReferenceTo(_reference); - OpenApiHeader resolved = new OpenApiHeader(_target); - if (!string.IsNullOrEmpty(_description)) resolved.Description = _description; - return resolved; + if (!string.IsNullOrEmpty(_description)) _target.Description = _description; + return _target; } } @@ -74,42 +73,53 @@ internal OpenApiHeaderReference(OpenApiHeader target, string referenceId) /// public override string Description { - get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + get => string.IsNullOrEmpty(_description) ? Target?.Description : _description; set => _description = value; } + private bool? _required; /// - public override bool Required { get => Target.Required; set => Target.Required = value; } + public override bool Required { get => _required is not null ? _required.Value : Target?.Required ?? false; set => _required = value; } + private bool? _deprecated; /// - public override bool Deprecated { get => Target.Deprecated; set => Target.Deprecated = value; } + public override bool Deprecated { get => _deprecated is not null ? _deprecated.Value : Target?.Deprecated ?? false; set => _deprecated = value; } + private bool? _allowEmptyValue; /// - public override bool AllowEmptyValue { get => Target.AllowEmptyValue; set => Target.AllowEmptyValue = value; } + public override bool AllowEmptyValue { get => _allowEmptyValue is not null ? _allowEmptyValue.Value : Target?.AllowEmptyValue ?? false; set => _allowEmptyValue = value; } + private OpenApiSchema _schema; /// - public override OpenApiSchema Schema { get => Target.Schema; set => Target.Schema = value; } + public override OpenApiSchema Schema { get => _schema is not null ? _schema : Target?.Schema; set => _schema = value; } + private ParameterStyle? _style; /// - public override ParameterStyle? Style { get => Target.Style; set => Target.Style = value; } + public override ParameterStyle? Style { get => _style is not null ? _style : Target?.Style; set => _style = value; } + private bool? _explode; /// - public override bool Explode { get => Target.Explode; set => Target.Explode = value; } + public override bool Explode { get => _explode is not null ? _explode.Value : Target?.Explode ?? false; set => _explode = value; } + private bool? _allowReserved; /// - public override bool AllowReserved { get => Target.AllowReserved; set => Target.AllowReserved = value; } + public override bool AllowReserved { get => _allowReserved is not null ? _allowReserved.Value : Target?.AllowReserved ?? false ; set => _allowReserved = value; } + private JsonNode _example; /// - public override JsonNode Example { get => Target.Example; set => Target.Example = value; } + public override JsonNode Example { get => _example is not null ? _example : Target?.Example; set => _example = value; } + private IDictionary _examples; /// - public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } + public override IDictionary Examples { get => _examples is not null ? _examples : Target?.Examples; set => _examples = value; } + private IDictionary _content; /// - public override IDictionary Content { get => Target.Content; set => Target.Content = value; } + public override IDictionary Content { get => _content is not null ? _content : Target?.Content; set => _content = value; } + private IDictionary _extensions; /// - public override IDictionary Extensions { get => base.Extensions; set => base.Extensions = value; } + public override IDictionary Extensions { get => _extensions is not null ? _extensions : Target?.Extensions; set => _extensions = value; } /// public override void SerializeAsV31(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 05817ddc9..d0e76cbc0 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -28,9 +28,8 @@ public OpenApiLink Target get { _target ??= Reference.HostDocument.ResolveReferenceTo(_reference); - OpenApiLink resolved = new OpenApiLink(_target); - if (!string.IsNullOrEmpty(_description)) resolved.Description = _description; - return resolved; + if (!string.IsNullOrEmpty(_description)) _target.Description = _description; + return _target; } } @@ -70,14 +69,17 @@ internal OpenApiLinkReference(OpenApiLink target, string referenceId) }; } + private string _operationRef; /// - public override string OperationRef { get => Target.OperationRef; set => Target.OperationRef = value; } + public override string OperationRef { get => !string.IsNullOrEmpty(_operationRef) ? _operationRef : Target?.OperationRef; set => _operationRef = value; } + private string _operationId; /// - public override string OperationId { get => Target.OperationId; set => Target.OperationId = value; } + public override string OperationId { get => !string.IsNullOrEmpty(_operationId) ? _operationId : Target?.OperationId; set => _operationId = value; } + private OpenApiServer _server; /// - public override OpenApiServer Server { get => Target.Server; set => Target.Server = value; } + public override OpenApiServer Server { get => _server is not null ? _server : Target?.Server; set => _server = value; } /// public override string Description @@ -86,14 +88,17 @@ public override string Description set => _description = value; } + private Dictionary _parameters; /// - public override Dictionary Parameters { get => Target.Parameters; set => Target.Parameters = value; } + public override Dictionary Parameters { get => _parameters is not null ? _parameters : Target?.Parameters; set => _parameters = value; } + private RuntimeExpressionAnyWrapper _requestBody; /// - public override RuntimeExpressionAnyWrapper RequestBody { get => Target.RequestBody; set => Target.RequestBody = value; } + public override RuntimeExpressionAnyWrapper RequestBody { get => _requestBody is not null ? _requestBody : Target?.RequestBody; set => _requestBody = value; } + private IDictionary _extensions; /// - public override IDictionary Extensions { get => base.Extensions; set => base.Extensions = value; } + public override IDictionary Extensions { get => _extensions is not null ? _extensions : Target?.Extensions; set => _extensions = value; } /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index 9df1e7be2..7efafa960 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -31,9 +31,8 @@ public OpenApiParameter Target get { _target ??= Reference.HostDocument.ResolveReferenceTo(_reference); - OpenApiParameter resolved = new OpenApiParameter(_target); - if (!string.IsNullOrEmpty(_description)) resolved.Description = _description; - return resolved; + if (!string.IsNullOrEmpty(_description)) _target.Description = _description; + return _target; } } @@ -73,39 +72,48 @@ internal OpenApiParameterReference(OpenApiParameter target, string referenceId) }; } + private string _name; /// - public override string Name { get => Target.Name; set => Target.Name = value; } + public override string Name { get => !string.IsNullOrEmpty(_name) ? _name : Target?.Name; set => _name = value; } /// public override string Description { - get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + get => string.IsNullOrEmpty(_description) ? Target?.Description : _description; set => _description = value; } + private bool? _required; /// - public override bool Required { get => Target.Required; set => Target.Required = value; } + public override bool Required { get => _required is not null ? _required.Value : Target?.Required ?? false; set => _required = value; } + private bool? _deprecated; /// - public override bool Deprecated { get => Target.Deprecated; set => Target.Deprecated = value; } + public override bool Deprecated { get => _deprecated is not null ? _deprecated.Value : Target?.Deprecated ?? false; set => _deprecated = value; } + private bool? _allowEmptyValue; /// - public override bool AllowEmptyValue { get => Target.AllowEmptyValue; set => Target.AllowEmptyValue = value; } + public override bool AllowEmptyValue { get => _allowEmptyValue is not null ? _allowEmptyValue.Value : Target?.AllowEmptyValue ?? false; set => _allowEmptyValue = value; } + private bool? _allowReserved; /// - public override bool AllowReserved { get => Target.AllowReserved; set => Target.AllowReserved = value; } + public override bool AllowReserved { get => _allowReserved is not null ? _allowReserved.Value : Target?.AllowReserved ?? false; set => _allowReserved = value; } + private OpenApiSchema _schema; /// - public override OpenApiSchema Schema { get => Target.Schema; set => Target.Schema = value; } + public override OpenApiSchema Schema { get => _schema is not null ? _schema : Target?.Schema; set => _schema = value; } + private JsonNode _example; /// - public override IDictionary Examples { get => Target.Examples; set => Target.Examples = value; } + public override JsonNode Example { get => _example is not null ? _example : Target?.Example; set => _example = value; } + private IDictionary _examples; /// - public override JsonNode Example { get => Target.Example; set => Target.Example = value; } + public override IDictionary Examples { get => _examples is not null ? _examples : Target?.Examples; set => _examples = value; } + private ParameterLocation? _in; /// - public override ParameterLocation? In { get => Target.In; set => Target.In = value; } + public override ParameterLocation? In { get => _in is not null ? _in : Target?.In; set => _in = value; } /// public override ParameterStyle? Style @@ -121,12 +129,14 @@ public override bool Explode set => _explode = value; } + private IDictionary _content; /// - public override IDictionary Content { get => Target.Content; set => Target.Content = value; } + public override IDictionary Content { get => _content is not null ? _content : Target?.Content; set => _content = value; } + private IDictionary _extensions; /// - public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - + public override IDictionary Extensions { get => _extensions is not null ? _extensions : Target?.Extensions; set => _extensions = value; } + /// public override void SerializeAsV3(IOpenApiWriter writer) { diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs index fad8922ae..5620bc993 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs @@ -29,10 +29,9 @@ public OpenApiPathItem Target get { _target ??= Reference.HostDocument.ResolveReferenceTo(_reference); - OpenApiPathItem resolved = new OpenApiPathItem(_target); - if (!string.IsNullOrEmpty(_description)) resolved.Description = _description; - if (!string.IsNullOrEmpty(_summary)) resolved.Summary = _summary; - return resolved; + if (!string.IsNullOrEmpty(_description)) _target.Description = _description; + if (!string.IsNullOrEmpty(_summary)) _target.Summary = _summary; + return _target; } } @@ -75,29 +74,33 @@ internal OpenApiPathItemReference(OpenApiPathItem target, string referenceId) /// public override string Summary { - get => string.IsNullOrEmpty(_summary) ? Target.Summary : _summary; + get => string.IsNullOrEmpty(_summary) ? Target?.Summary : _summary; set => _summary = value; } /// public override string Description { - get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + get => string.IsNullOrEmpty(_description) ? Target?.Description : _description; set => _description = value; } + private IDictionary _operations; /// - public override IDictionary Operations { get => Target.Operations; set => Target.Operations = value; } + public override IDictionary Operations { get => _operations is not null ? _operations : Target?.Operations; set => _operations = value; } + private IList _servers; /// - public override IList Servers { get => Target.Servers; set => Target.Servers = value; } + public override IList Servers { get => _servers is not null ? _servers : Target?.Servers; set => _servers = value; } + private IList _parameters; /// - public override IList Parameters { get => Target.Parameters; set => Target.Parameters = value; } + public override IList Parameters { get => _parameters is not null ? _parameters : Target?.Parameters; set => _parameters = value; } + private IDictionary _extensions; /// - public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } - + public override IDictionary Extensions { get => _extensions is not null ? _extensions : Target?.Extensions; set => _extensions = value; } + /// public override void SerializeAsV31(IOpenApiWriter writer) { diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs index 59fb27724..ca8eb2f6c 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs @@ -28,9 +28,8 @@ public OpenApiRequestBody Target get { _target ??= Reference.HostDocument.ResolveReferenceTo(_reference); - OpenApiRequestBody resolved = new OpenApiRequestBody(_target); - if (!string.IsNullOrEmpty(_description)) resolved.Description = _description; - return resolved; + if (!string.IsNullOrEmpty(_description)) _target.Description = _description; + return _target; } } @@ -73,18 +72,21 @@ internal OpenApiRequestBodyReference(OpenApiRequestBody target, string reference /// public override string Description { - get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + get => string.IsNullOrEmpty(_description) ? Target?.Description : _description; set => _description = value; } + private IDictionary _content; /// - public override IDictionary Content { get => Target.Content; set => Target.Content = value; } + public override IDictionary Content { get => _content is not null ? _content : Target?.Content; set => _content = value; } + private bool? _required; /// - public override bool Required { get => Target.Required; set => Target.Required = value; } + public override bool Required { get => _required is not null ? _required.Value : Target?.Required ?? false; set => _required = value; } + private IDictionary _extensions; /// - public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + public override IDictionary Extensions { get => _extensions is not null ? _extensions : Target?.Extensions; set => _extensions = value; } /// public override void SerializeAsV3(IOpenApiWriter writer) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs index 2ac8aee27..a9836265b 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs @@ -137,7 +137,7 @@ private void SerializeInternal(IOpenApiWriter writer, Action action) { Utils.CheckArgumentNull(writer); - action(writer, this); + action(writer, Target); } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs index da2f9b745..f5d60ced4 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs @@ -81,6 +81,7 @@ public OpenApiSchema? Target get { _target ??= Reference.HostDocument?.ResolveReferenceTo(_reference); + if (!string.IsNullOrEmpty(_description)) _target.Description = _description; return _target; } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs index dcd5009b1..57c162f78 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs @@ -28,9 +28,8 @@ public OpenApiSecurityScheme Target get { _target ??= Reference.HostDocument.ResolveReferenceTo(_reference); - OpenApiSecurityScheme resolved = new OpenApiSecurityScheme(_target); - if (!string.IsNullOrEmpty(_description)) resolved.Description = _description; - return resolved; + if (!string.IsNullOrEmpty(_description)) _target.Description = _description; + return _target; } } @@ -69,30 +68,38 @@ internal OpenApiSecuritySchemeReference(string referenceId, OpenApiSecuritySchem /// public override string Description { - get => string.IsNullOrEmpty(_description) ? Target.Description : _description; + get => string.IsNullOrEmpty(_description) ? Target?.Description : _description; set => _description = value; } + private string _name; /// - public override string Name { get => Target.Name; set => Target.Name = value; } + public override string Name { get => !string.IsNullOrEmpty(_name) ? _name : Target?.Name; set => _name = value; } + private ParameterLocation? _in; /// - public override ParameterLocation? In { get => Target.In; set => Target.In = value; } + public override ParameterLocation? In { get => _in is not null ? _in : Target?.In; set => _in = value; } + private string _scheme; /// - public override string Scheme { get => Target.Scheme; set => Target.Scheme = value; } + public override string Scheme { get => !string.IsNullOrEmpty(_scheme) ? _scheme : Target?.Scheme; set => _scheme = value; } + private string _bearerFormat; /// - public override string BearerFormat { get => Target.BearerFormat; set => Target.BearerFormat = value; } + public override string BearerFormat { get => !string.IsNullOrEmpty(_bearerFormat) ? _bearerFormat : Target?.BearerFormat; set => _bearerFormat = value; } + private OpenApiOAuthFlows _flows; /// - public override OpenApiOAuthFlows Flows { get => Target.Flows; set => Target.Flows = value; } + public override OpenApiOAuthFlows Flows { get => _flows is not null ? _flows : Target?.Flows; set => _flows = value; } + private Uri _openIdConnectUrl; /// - public override Uri OpenIdConnectUrl { get => Target.OpenIdConnectUrl; set => Target.OpenIdConnectUrl = value; } + public override Uri OpenIdConnectUrl { get => _openIdConnectUrl is not null ? _openIdConnectUrl : Target?.OpenIdConnectUrl; set => _openIdConnectUrl = value; } + private IDictionary _extensions; /// - public override IDictionary Extensions { get => Target.Extensions; set => Target.Extensions = value; } + public override IDictionary Extensions { get => _extensions is not null ? _extensions : Target?.Extensions; set => _extensions = value; } + /// public override SecuritySchemeType? Type { get => Target.Type; set => Target.Type = value; } diff --git a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs index 2cb0ff189..346b31701 100644 --- a/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/References/OpenApiExampleReferenceTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Globalization;