From 4df4b264ae5bf65f67a9029df39d67e1d5170168 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 27 Jan 2025 08:58:15 -0500 Subject: [PATCH 1/4] chore: refactors common reference work to a base class to reduce duplication Signed-off-by: Vincent Biret --- .../References/BaseOpenApiReferenceHolder.cs | 79 +++++++++++++++++++ .../References/OpenApiCallbackReference.cs | 59 ++------------ .../References/OpenApiExampleReference.cs | 59 ++------------ .../References/OpenApiHeaderReference.cs | 58 ++------------ .../Models/References/OpenApiLinkReference.cs | 60 ++------------ .../References/OpenApiParameterReference.cs | 59 ++------------ .../PublicApi/PublicApi.approved.txt | 78 +++++++++--------- 7 files changed, 157 insertions(+), 295 deletions(-) create mode 100644 src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs diff --git a/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs new file mode 100644 index 000000000..98df8bbbd --- /dev/null +++ b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs @@ -0,0 +1,79 @@ +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Writers; + +namespace Microsoft.OpenApi.Models.References; +/// +/// Base class for OpenApiReferenceHolder. +/// +/// The concrete class implementation type for the model. +/// The interface type for the model. +public abstract class BaseOpenApiReferenceHolder : IOpenApiReferenceHolder where T : class, IOpenApiReferenceable, V +{ + internal T _target; + /// + public T Target + { + get + { + _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); + return _target; + } + } + /// + /// Copy constructor + /// + /// The parameter reference to copy + protected BaseOpenApiReferenceHolder(BaseOpenApiReferenceHolder source) + { + Utils.CheckArgumentNull(source); + Reference = source.Reference != null ? new(source.Reference) : null; + UnresolvedReference = source.UnresolvedReference; + //no need to copy summary and description as if they are not overridden, they will be fetched from the target + //if they are, the reference copy will handle it + } + private protected BaseOpenApiReferenceHolder(T target, string referenceId, ReferenceType referenceType) + { + _target = target; + + Reference = new OpenApiReference() + { + Id = referenceId, + Type = referenceType, + }; + } + /// + /// Constructor initializing the reference object. + /// + /// The reference Id. + /// The host OpenAPI document. + /// The reference type. + /// Optional: External resource in the reference. + /// It may be: + /// 1. a absolute/relative file path, for example: ../commons/pet.json + /// 2. a Url, for example: http://localhost/pet.json + /// + protected BaseOpenApiReferenceHolder(string referenceId, OpenApiDocument hostDocument, ReferenceType referenceType, string externalResource = null) + { + Utils.CheckArgumentNullOrEmpty(referenceId); + + Reference = new OpenApiReference() + { + Id = referenceId, + HostDocument = hostDocument, + Type = referenceType, + ExternalResource = externalResource + }; + } + /// + public bool UnresolvedReference { get; set; } + /// + public OpenApiReference Reference { get; set; } + /// + public abstract V CopyReferenceAsTargetElementWithOverrides(V source); + /// + public abstract void SerializeAsV2(IOpenApiWriter writer); + /// + public abstract void SerializeAsV3(IOpenApiWriter writer); + /// + public abstract void SerializeAsV31(IOpenApiWriter writer); +} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index f357c4532..bb6e38869 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -13,32 +13,8 @@ namespace Microsoft.OpenApi.Models.References /// /// Callback Object Reference: A reference to a map of possible out-of band callbacks related to the parent operation. /// - public class OpenApiCallbackReference : IOpenApiCallback, IOpenApiReferenceHolder + public class OpenApiCallbackReference : BaseOpenApiReferenceHolder, IOpenApiCallback { -#nullable enable - internal OpenApiCallback _target; - /// - public OpenApiReference Reference { get; set; } - - /// - public bool UnresolvedReference { get; set; } - - /// - /// Gets the target callback. - /// - /// - /// If the reference is not resolved, this will return null. - /// - public OpenApiCallback Target -#nullable restore - { - get - { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); - return _target; - } - } - /// /// Constructor initializing the reference object. /// @@ -49,39 +25,20 @@ public OpenApiCallback Target /// 1. an absolute/relative file path, for example: ../commons/pet.json /// 2. a Url, for example: http://localhost/pet.json /// - public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) + public OpenApiCallbackReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Callback, externalResource) { - Utils.CheckArgumentNullOrEmpty(referenceId); - - Reference = new OpenApiReference() - { - Id = referenceId, - HostDocument = hostDocument, - Type = ReferenceType.Callback, - ExternalResource = externalResource - }; } /// /// Copy constructor /// /// The callback reference to copy - public OpenApiCallbackReference(OpenApiCallbackReference callback) + public OpenApiCallbackReference(OpenApiCallbackReference callback):base(callback) { - Utils.CheckArgumentNull(callback); - Reference = callback.Reference != null ? new(callback.Reference) : null; - UnresolvedReference = callback.UnresolvedReference; } - internal OpenApiCallbackReference(OpenApiCallback target, string referenceId) + internal OpenApiCallbackReference(OpenApiCallback target, string referenceId):base(target, referenceId, ReferenceType.Callback) { - _target = target; - - Reference = new OpenApiReference() - { - Id = referenceId, - Type = ReferenceType.Callback, - }; } /// @@ -91,7 +48,7 @@ internal OpenApiCallbackReference(OpenApiCallback target, string referenceId) public IDictionary Extensions { get => Target?.Extensions; } /// - public void SerializeAsV3(IOpenApiWriter writer) + public override void SerializeAsV3(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -104,7 +61,7 @@ public void SerializeAsV3(IOpenApiWriter writer) } /// - public void SerializeAsV31(IOpenApiWriter writer) + public override void SerializeAsV31(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -117,7 +74,7 @@ public void SerializeAsV31(IOpenApiWriter writer) } /// - public IOpenApiCallback CopyReferenceAsTargetElementWithOverrides(IOpenApiCallback source) + public override IOpenApiCallback CopyReferenceAsTargetElementWithOverrides(IOpenApiCallback source) { // the copy here is never called since callbacks do not have any overridable fields. // if the spec evolves to include overridable fields for callbacks, the serialize methods will need to call this copy method. @@ -125,7 +82,7 @@ public IOpenApiCallback CopyReferenceAsTargetElementWithOverrides(IOpenApiCallba } /// - public void SerializeAsV2(IOpenApiWriter writer) + public override void SerializeAsV2(IOpenApiWriter writer) { // examples components are not supported in OAS 2.0 Reference.SerializeAsV2(writer); diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index 9f1842001..60c35f760 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -13,30 +13,8 @@ namespace Microsoft.OpenApi.Models.References /// /// Example Object Reference. /// - public class OpenApiExampleReference : IOpenApiReferenceHolder, IOpenApiExample + public class OpenApiExampleReference : BaseOpenApiReferenceHolder, IOpenApiExample { - /// - public OpenApiReference Reference { get; set; } - - /// - public bool UnresolvedReference { get; set; } - internal OpenApiExample _target; - - /// - /// Gets the target example. - /// - /// - /// If the reference is not resolved, this will return null. - /// - public OpenApiExample Target - { - get - { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); - return _target; - } - } - /// /// Constructor initializing the reference object. /// @@ -47,41 +25,20 @@ public OpenApiExample Target /// 1. a absolute/relative file path, for example: ../commons/pet.json /// 2. a Url, for example: http://localhost/pet.json /// - public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) + public OpenApiExampleReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Example, externalResource) { - Utils.CheckArgumentNullOrEmpty(referenceId); - - Reference = new OpenApiReference() - { - Id = referenceId, - HostDocument = hostDocument, - Type = ReferenceType.Example, - ExternalResource = externalResource - }; } /// /// Copy constructor /// /// The reference to copy. - public OpenApiExampleReference(OpenApiExampleReference example) + public OpenApiExampleReference(OpenApiExampleReference example):base(example) { - Utils.CheckArgumentNull(example); - Reference = example.Reference != null ? new(example.Reference) : null; - UnresolvedReference = example.UnresolvedReference; - //no need to copy summary and description as if they are not overridden, they will be fetched from the target - //if they are, the reference copy will handle it } - internal OpenApiExampleReference(OpenApiExample target, string referenceId) + internal OpenApiExampleReference(OpenApiExample target, string referenceId):base(target, referenceId, ReferenceType.Example) { - _target = target; - - Reference = new OpenApiReference() - { - Id = referenceId, - Type = ReferenceType.Example, - }; } /// @@ -120,7 +77,7 @@ public string Summary public JsonNode Value { get => Target?.Value; } /// - public void SerializeAsV3(IOpenApiWriter writer) + public override void SerializeAsV3(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -133,7 +90,7 @@ public void SerializeAsV3(IOpenApiWriter writer) } /// - public void SerializeAsV31(IOpenApiWriter writer) + public override void SerializeAsV31(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -146,13 +103,13 @@ public void SerializeAsV31(IOpenApiWriter writer) } /// - public IOpenApiExample CopyReferenceAsTargetElementWithOverrides(IOpenApiExample source) + public override IOpenApiExample CopyReferenceAsTargetElementWithOverrides(IOpenApiExample source) { return source is OpenApiExample ? new OpenApiExample(this) : source; } /// - public void SerializeAsV2(IOpenApiWriter writer) + public override void SerializeAsV2(IOpenApiWriter writer) { // examples components are not supported in OAS 2.0 Reference.SerializeAsV2(writer); diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index 71e8cace0..0e53dfb03 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -13,29 +13,8 @@ namespace Microsoft.OpenApi.Models.References /// /// Header Object Reference. /// - public class OpenApiHeaderReference : IOpenApiHeader, IOpenApiReferenceHolder + public class OpenApiHeaderReference : BaseOpenApiReferenceHolder, IOpenApiHeader { - /// - public OpenApiReference Reference { get; set; } - - /// - public bool UnresolvedReference { get; set; } - internal OpenApiHeader _target; - /// - /// Gets the target header. - /// - /// - /// If the reference is not resolved, this will return null. - /// - public OpenApiHeader Target - { - get - { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); - return _target; - } - } - /// /// Constructor initializing the reference object. /// @@ -46,41 +25,20 @@ public OpenApiHeader Target /// 1. a absolute/relative file path, for example: ../commons/pet.json /// 2. a Url, for example: http://localhost/pet.json /// - public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) + public OpenApiHeaderReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Header, externalResource) { - Utils.CheckArgumentNullOrEmpty(referenceId); - - Reference = new OpenApiReference() - { - Id = referenceId, - HostDocument = hostDocument, - Type = ReferenceType.Header, - ExternalResource = externalResource - }; } /// /// Copy constructor /// /// The object to copy - public OpenApiHeaderReference(OpenApiHeaderReference header) + public OpenApiHeaderReference(OpenApiHeaderReference header):base(header) { - Utils.CheckArgumentNull(header); - Reference = header.Reference != null ? new(header.Reference) : null; - UnresolvedReference = header.UnresolvedReference; - //no need to copy description as if they are not overridden, they will be fetched from the target - //if they are, the reference copy will handle it } - internal OpenApiHeaderReference(OpenApiHeader target, string referenceId) + internal OpenApiHeaderReference(OpenApiHeader target, string referenceId):base(target, referenceId, ReferenceType.Header) { - _target = target; - - Reference = new OpenApiReference() - { - Id = referenceId, - Type = ReferenceType.Header, - }; } /// @@ -130,7 +88,7 @@ public string Description public IDictionary Extensions { get => Target?.Extensions; } /// - public void SerializeAsV31(IOpenApiWriter writer) + public override void SerializeAsV31(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -143,7 +101,7 @@ public void SerializeAsV31(IOpenApiWriter writer) } /// - public void SerializeAsV3(IOpenApiWriter writer) + public override void SerializeAsV3(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -156,7 +114,7 @@ public void SerializeAsV3(IOpenApiWriter writer) } /// - public void SerializeAsV2(IOpenApiWriter writer) + public override void SerializeAsV2(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -168,7 +126,7 @@ public void SerializeAsV2(IOpenApiWriter writer) } } /// - public IOpenApiHeader CopyReferenceAsTargetElementWithOverrides(IOpenApiHeader source) + public override IOpenApiHeader CopyReferenceAsTargetElementWithOverrides(IOpenApiHeader source) { return source is OpenApiHeader ? new OpenApiHeader(this) : source; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 57a4b1e4f..4d805592d 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -12,29 +12,8 @@ namespace Microsoft.OpenApi.Models.References /// /// Link Object Reference. /// - public class OpenApiLinkReference : IOpenApiLink, IOpenApiReferenceHolder + public class OpenApiLinkReference : BaseOpenApiReferenceHolder, IOpenApiLink { - /// - public OpenApiReference Reference { get; set; } - - /// - public bool UnresolvedReference { get; set; } - internal OpenApiLink _target; - /// - /// Gets the target link. - /// - /// - /// If the reference is not resolved, this will return null. - /// - public OpenApiLink Target - { - get - { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); - return _target; - } - } - /// /// Constructor initializing the reference object. /// @@ -45,41 +24,18 @@ public OpenApiLink Target /// 1. a absolute/relative file path, for example: ../commons/pet.json /// 2. a Url, for example: http://localhost/pet.json /// - public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) + public OpenApiLinkReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Link, externalResource) { - Utils.CheckArgumentNullOrEmpty(referenceId); - - Reference = new OpenApiReference() - { - Id = referenceId, - HostDocument = hostDocument, - Type = ReferenceType.Link, - ExternalResource = externalResource - }; } /// /// Copy constructor. /// /// The reference to copy - public OpenApiLinkReference(OpenApiLinkReference reference) + public OpenApiLinkReference(OpenApiLinkReference reference):base(reference) { - Utils.CheckArgumentNull(reference); - - Reference = reference.Reference != null ? new(reference.Reference) : null; - UnresolvedReference = reference.UnresolvedReference; - //no need to copy summary and description as if they are not overridden, they will be fetched from the target - //if they are, the reference copy will handle it } - - internal OpenApiLinkReference(OpenApiLink target, string referenceId) + internal OpenApiLinkReference(OpenApiLink target, string referenceId):base(target, referenceId, ReferenceType.Link) { - _target = target; - - Reference = new OpenApiReference() - { - Id = referenceId, - Type = ReferenceType.Link, - }; } /// @@ -114,7 +70,7 @@ public string Description public IDictionary Extensions { get => Target?.Extensions; } /// - public void SerializeAsV3(IOpenApiWriter writer) + public override void SerializeAsV3(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -127,7 +83,7 @@ public void SerializeAsV3(IOpenApiWriter writer) } /// - public void SerializeAsV31(IOpenApiWriter writer) + public override void SerializeAsV31(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -140,13 +96,13 @@ public void SerializeAsV31(IOpenApiWriter writer) } /// - public void SerializeAsV2(IOpenApiWriter writer) + public override void SerializeAsV2(IOpenApiWriter writer) { // Link object does not exist in V2. } /// - public IOpenApiLink CopyReferenceAsTargetElementWithOverrides(IOpenApiLink source) + public override IOpenApiLink CopyReferenceAsTargetElementWithOverrides(IOpenApiLink source) { return source is OpenApiLink ? new OpenApiLink(this) : source; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index da9d1dabd..c5d9bed57 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -13,30 +13,8 @@ namespace Microsoft.OpenApi.Models.References /// /// Parameter Object Reference. /// - public class OpenApiParameterReference : IOpenApiParameter, IOpenApiReferenceHolder + public class OpenApiParameterReference : BaseOpenApiReferenceHolder, IOpenApiParameter { - /// - public OpenApiReference Reference { get; set; } - - /// - public bool UnresolvedReference { get; set; } - internal OpenApiParameter _target; - - /// - /// Gets the target parameter. - /// - /// - /// If the reference is not resolved, this will return null. - /// - public OpenApiParameter Target - { - get - { - _target ??= Reference.HostDocument.ResolveReferenceTo(Reference); - return _target; - } - } - /// /// Constructor initializing the reference object. /// @@ -47,41 +25,20 @@ public OpenApiParameter Target /// 1. a absolute/relative file path, for example: ../commons/pet.json /// 2. a Url, for example: http://localhost/pet.json /// - public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null) + public OpenApiParameterReference(string referenceId, OpenApiDocument hostDocument, string externalResource = null):base(referenceId, hostDocument, ReferenceType.Parameter, externalResource) { - Utils.CheckArgumentNullOrEmpty(referenceId); - - Reference = new OpenApiReference() - { - Id = referenceId, - HostDocument = hostDocument, - Type = ReferenceType.Parameter, - ExternalResource = externalResource - }; } /// /// Copy constructor /// /// The parameter reference to copy - public OpenApiParameterReference(OpenApiParameterReference parameter) + public OpenApiParameterReference(OpenApiParameterReference parameter):base(parameter) { - Utils.CheckArgumentNull(parameter); - Reference = parameter.Reference != null ? new(parameter.Reference) : null; - UnresolvedReference = parameter.UnresolvedReference; - //no need to copy summary and description as if they are not overridden, they will be fetched from the target - //if they are, the reference copy will handle it } - internal OpenApiParameterReference(OpenApiParameter target, string referenceId) + internal OpenApiParameterReference(OpenApiParameter target, string referenceId):base(target, referenceId, ReferenceType.Parameter) { - _target = target; - - Reference = new OpenApiReference() - { - Id = referenceId, - Type = ReferenceType.Parameter, - }; } /// @@ -137,7 +94,7 @@ public string Description public IDictionary Extensions { get => Target.Extensions; } /// - public void SerializeAsV3(IOpenApiWriter writer) + public override void SerializeAsV3(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -150,7 +107,7 @@ public void SerializeAsV3(IOpenApiWriter writer) } /// - public void SerializeAsV31(IOpenApiWriter writer) + public override void SerializeAsV31(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -163,7 +120,7 @@ public void SerializeAsV31(IOpenApiWriter writer) } /// - public void SerializeAsV2(IOpenApiWriter writer) + public override void SerializeAsV2(IOpenApiWriter writer) { if (!writer.GetSettings().ShouldInlineReference(Reference)) { @@ -176,7 +133,7 @@ public void SerializeAsV2(IOpenApiWriter writer) } /// - public IOpenApiParameter CopyReferenceAsTargetElementWithOverrides(IOpenApiParameter source) + public override IOpenApiParameter CopyReferenceAsTargetElementWithOverrides(IOpenApiParameter source) { return source is OpenApiParameter ? new OpenApiParameter(this) : source; } diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index f89d60453..9783e5de8 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -1155,38 +1155,45 @@ namespace Microsoft.OpenApi.Models } namespace Microsoft.OpenApi.Models.References { - public class OpenApiCallbackReference : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback + public abstract class BaseOpenApiReferenceHolder : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable + where T : class, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, V + { + protected BaseOpenApiReferenceHolder(Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder source) { } + protected BaseOpenApiReferenceHolder(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, Microsoft.OpenApi.Models.ReferenceType referenceType, string externalResource = null) { } + public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } + public T Target { get; } + public bool UnresolvedReference { get; set; } + public abstract V CopyReferenceAsTargetElementWithOverrides(V source); + public abstract void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer); + public abstract void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer); + public abstract void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer); + } + public class OpenApiCallbackReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback { public OpenApiCallbackReference(Microsoft.OpenApi.Models.References.OpenApiCallbackReference callback) { } public OpenApiCallbackReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public System.Collections.Generic.IDictionary Extensions { get; } public System.Collections.Generic.Dictionary PathItems { get; } - public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } - public Microsoft.OpenApi.Models.OpenApiCallback Target { get; } - public bool UnresolvedReference { get; set; } - public Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback source) { } - public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback source) { } + public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiExampleReference : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiExample, Microsoft.OpenApi.Models.Interfaces.IOpenApiSummarizedElement + public class OpenApiExampleReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiExample, Microsoft.OpenApi.Models.Interfaces.IOpenApiSummarizedElement { public OpenApiExampleReference(Microsoft.OpenApi.Models.References.OpenApiExampleReference example) { } public OpenApiExampleReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } public string Description { get; set; } public System.Collections.Generic.IDictionary Extensions { get; } public string ExternalValue { get; } - public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } public string Summary { get; set; } - public Microsoft.OpenApi.Models.OpenApiExample Target { get; } - public bool UnresolvedReference { get; set; } public System.Text.Json.Nodes.JsonNode Value { get; } - public Microsoft.OpenApi.Models.Interfaces.IOpenApiExample CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample source) { } - public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override Microsoft.OpenApi.Models.Interfaces.IOpenApiExample CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample source) { } + public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiHeaderReference : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader + public class OpenApiHeaderReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader { public OpenApiHeaderReference(Microsoft.OpenApi.Models.References.OpenApiHeaderReference header) { } public OpenApiHeaderReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } @@ -1199,18 +1206,15 @@ namespace Microsoft.OpenApi.Models.References public System.Collections.Generic.IDictionary Examples { get; } public bool Explode { get; } public System.Collections.Generic.IDictionary Extensions { get; } - public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } public bool Required { get; } public Microsoft.OpenApi.Models.OpenApiSchema Schema { get; } public Microsoft.OpenApi.Models.ParameterStyle? Style { get; } - public Microsoft.OpenApi.Models.OpenApiHeader Target { get; } - public bool UnresolvedReference { get; set; } - public Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader source) { } - public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader source) { } + public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiLinkReference : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiLink + public class OpenApiLinkReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiLink { public OpenApiLinkReference(Microsoft.OpenApi.Models.References.OpenApiLinkReference reference) { } public OpenApiLinkReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } @@ -1219,17 +1223,14 @@ namespace Microsoft.OpenApi.Models.References public string OperationId { get; } public string OperationRef { get; } public System.Collections.Generic.IDictionary Parameters { get; } - public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } public Microsoft.OpenApi.Models.RuntimeExpressionAnyWrapper RequestBody { get; } public Microsoft.OpenApi.Models.OpenApiServer Server { get; } - public Microsoft.OpenApi.Models.OpenApiLink Target { get; } - public bool UnresolvedReference { get; set; } - public Microsoft.OpenApi.Models.Interfaces.IOpenApiLink CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiLink source) { } - public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override Microsoft.OpenApi.Models.Interfaces.IOpenApiLink CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiLink source) { } + public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } - public class OpenApiParameterReference : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter + public class OpenApiParameterReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter { public OpenApiParameterReference(Microsoft.OpenApi.Models.References.OpenApiParameterReference parameter) { } public OpenApiParameterReference(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, string externalResource = null) { } @@ -1244,16 +1245,13 @@ namespace Microsoft.OpenApi.Models.References public System.Collections.Generic.IDictionary Extensions { get; } public Microsoft.OpenApi.Models.ParameterLocation? In { get; } public string Name { get; } - public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; } public bool Required { get; } public Microsoft.OpenApi.Models.OpenApiSchema Schema { get; } public Microsoft.OpenApi.Models.ParameterStyle? Style { get; } - public Microsoft.OpenApi.Models.OpenApiParameter Target { get; } - public bool UnresolvedReference { get; set; } - public Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter source) { } - public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter source) { } + public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiPathItemReference : Microsoft.OpenApi.Models.OpenApiPathItem, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable { From 8c2c1888c64a7421e40d82bf9c58ae71dbdcbf3b Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 27 Jan 2025 09:20:43 -0500 Subject: [PATCH 2/4] chore: typo fix Signed-off-by: Vincent Biret --- src/Microsoft.OpenApi/Models/Interfaces/IOpenApiParameter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiParameter.cs b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiParameter.cs index 9044f26a9..363cc1cd4 100644 --- a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiParameter.cs +++ b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiParameter.cs @@ -5,7 +5,7 @@ namespace Microsoft.OpenApi.Models.Interfaces; /// -/// Defines the base properties for the example object. +/// Defines the base properties for the parameter object. /// This interface is provided for type assertions but should not be implemented by package consumers beyond automatic mocking. /// public interface IOpenApiParameter : IOpenApiDescribedElement, IOpenApiSerializable, IOpenApiReadOnlyExtensible From aad26b4d45da3baa162ca63456b2e637f0fb5eeb Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 27 Jan 2025 09:25:46 -0500 Subject: [PATCH 3/4] chore: removes duplicated serialize internal method Signed-off-by: Vincent Biret --- .../References/BaseOpenApiReferenceHolder.cs | 14 ++++++++++++++ .../Models/References/OpenApiCallbackReference.cs | 8 -------- .../Models/References/OpenApiExampleReference.cs | 8 -------- .../Models/References/OpenApiHeaderReference.cs | 8 -------- .../Models/References/OpenApiLinkReference.cs | 8 -------- .../Models/References/OpenApiParameterReference.cs | 8 -------- 6 files changed, 14 insertions(+), 40 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs index 98df8bbbd..0a7f7b983 100644 --- a/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs +++ b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs @@ -1,3 +1,4 @@ +using System; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; @@ -76,4 +77,17 @@ protected BaseOpenApiReferenceHolder(string referenceId, OpenApiDocument hostDoc public abstract void SerializeAsV3(IOpenApiWriter writer); /// public abstract void SerializeAsV31(IOpenApiWriter writer); + + /// + /// Serialize the reference as a reference or the target object. + /// This method is used to accelerate the serialization methods implementations. + /// + /// The OpenApiWriter. + /// The action to serialize the target object. + private protected void SerializeInternal(IOpenApiWriter writer, + Action action) + { + Utils.CheckArgumentNull(writer); + action(writer, Target); + } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index bb6e38869..6a193f2e6 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -87,13 +87,5 @@ public override void SerializeAsV2(IOpenApiWriter writer) // examples components are not supported in OAS 2.0 Reference.SerializeAsV2(writer); } - - /// - private void SerializeInternal(IOpenApiWriter writer, - Action action) - { - Utils.CheckArgumentNull(writer); - action(writer, Target); - } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index 60c35f760..e35291b9a 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -114,13 +114,5 @@ public override void SerializeAsV2(IOpenApiWriter writer) // examples components are not supported in OAS 2.0 Reference.SerializeAsV2(writer); } - - /// - private void SerializeInternal(IOpenApiWriter writer, - Action action) - { - Utils.CheckArgumentNull(writer); - action(writer, Target); - } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index 0e53dfb03..405853c5f 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -130,13 +130,5 @@ public override IOpenApiHeader CopyReferenceAsTargetElementWithOverrides(IOpenAp { return source is OpenApiHeader ? new OpenApiHeader(this) : source; } - - /// - private void SerializeInternal(IOpenApiWriter writer, - Action action) - { - Utils.CheckArgumentNull(writer); - action(writer, Target); - } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 4d805592d..5dacc6112 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -106,13 +106,5 @@ public override IOpenApiLink CopyReferenceAsTargetElementWithOverrides(IOpenApiL { return source is OpenApiLink ? new OpenApiLink(this) : source; } - - /// - private void SerializeInternal(IOpenApiWriter writer, - Action action) - { - Utils.CheckArgumentNull(writer); - action(writer, Target); - } } } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index c5d9bed57..edf5086d7 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -137,13 +137,5 @@ public override IOpenApiParameter CopyReferenceAsTargetElementWithOverrides(IOpe { return source is OpenApiParameter ? new OpenApiParameter(this) : source; } - - /// - private void SerializeInternal(IOpenApiWriter writer, - Action action) - { - Utils.CheckArgumentNull(writer); - action(writer, Target); - } } } From a72aa29048b4b28a736af032f4fd0849ff31a50f Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Mon, 27 Jan 2025 09:34:18 -0500 Subject: [PATCH 4/4] chore: removes duplicated serialization method implementation for references Signed-off-by: Vincent Biret --- .../References/BaseOpenApiReferenceHolder.cs | 40 ++++++++++++++++-- .../References/OpenApiCallbackReference.cs | 28 ------------- .../References/OpenApiExampleReference.cs | 26 ------------ .../References/OpenApiHeaderReference.cs | 38 ----------------- .../Models/References/OpenApiLinkReference.cs | 26 ------------ .../References/OpenApiParameterReference.cs | 41 ------------------- .../PublicApi/PublicApi.approved.txt | 19 ++------- 7 files changed, 40 insertions(+), 178 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs index 0a7f7b983..6b1f02575 100644 --- a/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs +++ b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs @@ -8,7 +8,7 @@ namespace Microsoft.OpenApi.Models.References; /// /// The concrete class implementation type for the model. /// The interface type for the model. -public abstract class BaseOpenApiReferenceHolder : IOpenApiReferenceHolder where T : class, IOpenApiReferenceable, V +public abstract class BaseOpenApiReferenceHolder : IOpenApiReferenceHolder where T : class, IOpenApiReferenceable, V where V : IOpenApiSerializable { internal T _target; /// @@ -72,11 +72,43 @@ protected BaseOpenApiReferenceHolder(string referenceId, OpenApiDocument hostDoc /// public abstract V CopyReferenceAsTargetElementWithOverrides(V source); /// - public abstract void SerializeAsV2(IOpenApiWriter writer); + public void SerializeAsV3(IOpenApiWriter writer) + { + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + Reference.SerializeAsV3(writer); + } + else + { + SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV3(writer)); + } + } + /// - public abstract void SerializeAsV3(IOpenApiWriter writer); + public void SerializeAsV31(IOpenApiWriter writer) + { + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + Reference.SerializeAsV31(writer); + } + else + { + SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV31(writer)); + } + } + /// - public abstract void SerializeAsV31(IOpenApiWriter writer); + public virtual void SerializeAsV2(IOpenApiWriter writer) + { + if (!writer.GetSettings().ShouldInlineReference(Reference)) + { + Reference.SerializeAsV2(writer); + } + else + { + SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV2(writer)); + } + } /// /// Serialize the reference as a reference or the target object. diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs index 6a193f2e6..14b96c9e6 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs @@ -47,37 +47,9 @@ internal OpenApiCallbackReference(OpenApiCallback target, string referenceId):ba /// public IDictionary Extensions { get => Target?.Extensions; } - /// - public override void SerializeAsV3(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV3(writer); - } - else - { - SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer)); - } - } - - /// - public override void SerializeAsV31(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV31(writer); - } - else - { - SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer)); - } - } - /// public override IOpenApiCallback CopyReferenceAsTargetElementWithOverrides(IOpenApiCallback source) { - // the copy here is never called since callbacks do not have any overridable fields. - // if the spec evolves to include overridable fields for callbacks, the serialize methods will need to call this copy method. return source is OpenApiCallback ? new OpenApiCallback(this) : source; } diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs index e35291b9a..9a1c5ae16 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs @@ -76,32 +76,6 @@ public string Summary /// public JsonNode Value { get => Target?.Value; } - /// - public override void SerializeAsV3(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV3(writer); - } - else - { - SerializeInternal(writer, (writer, referenceElement) => CopyReferenceAsTargetElementWithOverrides(referenceElement).SerializeAsV3(writer)); - } - } - - /// - public override void SerializeAsV31(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV31(writer); - } - else - { - SerializeInternal(writer, (writer, referenceElement) => CopyReferenceAsTargetElementWithOverrides(referenceElement).SerializeAsV31(writer)); - } - } - /// public override IOpenApiExample CopyReferenceAsTargetElementWithOverrides(IOpenApiExample source) { diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs index 405853c5f..dfbee5ce7 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs @@ -87,44 +87,6 @@ public string Description /// public IDictionary Extensions { get => Target?.Extensions; } - /// - public override void SerializeAsV31(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV31(writer); - } - else - { - SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV31(writer)); - } - } - - /// - public override void SerializeAsV3(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV3(writer); - } - else - { - SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV3(writer)); - } - } - - /// - public override void SerializeAsV2(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV2(writer); - } - else - { - SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV2(writer)); - } - } /// public override IOpenApiHeader CopyReferenceAsTargetElementWithOverrides(IOpenApiHeader source) { diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs index 5dacc6112..f177bee2c 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs @@ -69,32 +69,6 @@ public string Description /// public IDictionary Extensions { get => Target?.Extensions; } - /// - public override void SerializeAsV3(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV3(writer); - } - else - { - SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV3(writer)); - } - } - - /// - public override void SerializeAsV31(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV31(writer); - } - else - { - SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV31(writer)); - } - } - /// public override void SerializeAsV2(IOpenApiWriter writer) { diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs index edf5086d7..82c73afda 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs @@ -1,12 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using System; using System.Collections.Generic; using System.Text.Json.Nodes; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models.Interfaces; -using Microsoft.OpenApi.Writers; namespace Microsoft.OpenApi.Models.References { @@ -93,45 +91,6 @@ public string Description /// public IDictionary Extensions { get => Target.Extensions; } - /// - public override void SerializeAsV3(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV3(writer); - } - else - { - SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV3(writer)); - } - } - - /// - public override void SerializeAsV31(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV31(writer); - } - else - { - SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV31(writer)); - } - } - - /// - public override void SerializeAsV2(IOpenApiWriter writer) - { - if (!writer.GetSettings().ShouldInlineReference(Reference)) - { - Reference.SerializeAsV2(writer); - } - else - { - SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV2(writer)); - } - } - /// public override IOpenApiParameter CopyReferenceAsTargetElementWithOverrides(IOpenApiParameter source) { diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 9783e5de8..3e8451080 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -1157,6 +1157,7 @@ namespace Microsoft.OpenApi.Models.References { public abstract class BaseOpenApiReferenceHolder : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable where T : class, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, V + where V : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { protected BaseOpenApiReferenceHolder(Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder source) { } protected BaseOpenApiReferenceHolder(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, Microsoft.OpenApi.Models.ReferenceType referenceType, string externalResource = null) { } @@ -1164,9 +1165,9 @@ namespace Microsoft.OpenApi.Models.References public T Target { get; } public bool UnresolvedReference { get; set; } public abstract V CopyReferenceAsTargetElementWithOverrides(V source); - public abstract void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer); - public abstract void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer); - public abstract void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer); + public virtual void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } + public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiCallbackReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback { @@ -1176,8 +1177,6 @@ namespace Microsoft.OpenApi.Models.References public System.Collections.Generic.Dictionary PathItems { get; } public override Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback source) { } public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiExampleReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiExample, Microsoft.OpenApi.Models.Interfaces.IOpenApiSummarizedElement { @@ -1190,8 +1189,6 @@ namespace Microsoft.OpenApi.Models.References public System.Text.Json.Nodes.JsonNode Value { get; } public override Microsoft.OpenApi.Models.Interfaces.IOpenApiExample CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample source) { } public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiHeaderReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader { @@ -1210,9 +1207,6 @@ namespace Microsoft.OpenApi.Models.References public Microsoft.OpenApi.Models.OpenApiSchema Schema { get; } public Microsoft.OpenApi.Models.ParameterStyle? Style { get; } public override Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader source) { } - public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiLinkReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiLink { @@ -1227,8 +1221,6 @@ namespace Microsoft.OpenApi.Models.References public Microsoft.OpenApi.Models.OpenApiServer Server { get; } public override Microsoft.OpenApi.Models.Interfaces.IOpenApiLink CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiLink source) { } public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiParameterReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter { @@ -1249,9 +1241,6 @@ namespace Microsoft.OpenApi.Models.References public Microsoft.OpenApi.Models.OpenApiSchema Schema { get; } public Microsoft.OpenApi.Models.ParameterStyle? Style { get; } public override Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter source) { } - public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } - public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } } public class OpenApiPathItemReference : Microsoft.OpenApi.Models.OpenApiPathItem, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiSerializable {