Skip to content

Commit a72aa29

Browse files
committedJan 27, 2025··
chore: removes duplicated serialization method implementation for references
Signed-off-by: Vincent Biret <[email protected]>
1 parent aad26b4 commit a72aa29

File tree

7 files changed

+40
-178
lines changed

7 files changed

+40
-178
lines changed
 

‎src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs

+36-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Microsoft.OpenApi.Models.References;
88
/// </summary>
99
/// <typeparam name="T">The concrete class implementation type for the model.</typeparam>
1010
/// <typeparam name="V">The interface type for the model.</typeparam>
11-
public abstract class BaseOpenApiReferenceHolder<T, V> : IOpenApiReferenceHolder<T, V> where T : class, IOpenApiReferenceable, V
11+
public abstract class BaseOpenApiReferenceHolder<T, V> : IOpenApiReferenceHolder<T, V> where T : class, IOpenApiReferenceable, V where V : IOpenApiSerializable
1212
{
1313
internal T _target;
1414
/// <inheritdoc/>
@@ -72,11 +72,43 @@ protected BaseOpenApiReferenceHolder(string referenceId, OpenApiDocument hostDoc
7272
/// <inheritdoc/>
7373
public abstract V CopyReferenceAsTargetElementWithOverrides(V source);
7474
/// <inheritdoc/>
75-
public abstract void SerializeAsV2(IOpenApiWriter writer);
75+
public void SerializeAsV3(IOpenApiWriter writer)
76+
{
77+
if (!writer.GetSettings().ShouldInlineReference(Reference))
78+
{
79+
Reference.SerializeAsV3(writer);
80+
}
81+
else
82+
{
83+
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV3(writer));
84+
}
85+
}
86+
7687
/// <inheritdoc/>
77-
public abstract void SerializeAsV3(IOpenApiWriter writer);
88+
public void SerializeAsV31(IOpenApiWriter writer)
89+
{
90+
if (!writer.GetSettings().ShouldInlineReference(Reference))
91+
{
92+
Reference.SerializeAsV31(writer);
93+
}
94+
else
95+
{
96+
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV31(writer));
97+
}
98+
}
99+
78100
/// <inheritdoc/>
79-
public abstract void SerializeAsV31(IOpenApiWriter writer);
101+
public virtual void SerializeAsV2(IOpenApiWriter writer)
102+
{
103+
if (!writer.GetSettings().ShouldInlineReference(Reference))
104+
{
105+
Reference.SerializeAsV2(writer);
106+
}
107+
else
108+
{
109+
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV2(writer));
110+
}
111+
}
80112

81113
/// <summary>
82114
/// Serialize the reference as a reference or the target object.

‎src/Microsoft.OpenApi/Models/References/OpenApiCallbackReference.cs

-28
Original file line numberDiff line numberDiff line change
@@ -47,37 +47,9 @@ internal OpenApiCallbackReference(OpenApiCallback target, string referenceId):ba
4747
/// <inheritdoc/>
4848
public IDictionary<string, IOpenApiExtension> Extensions { get => Target?.Extensions; }
4949

50-
/// <inheritdoc/>
51-
public override void SerializeAsV3(IOpenApiWriter writer)
52-
{
53-
if (!writer.GetSettings().ShouldInlineReference(Reference))
54-
{
55-
Reference.SerializeAsV3(writer);
56-
}
57-
else
58-
{
59-
SerializeInternal(writer, (writer, element) => element.SerializeAsV3(writer));
60-
}
61-
}
62-
63-
/// <inheritdoc/>
64-
public override void SerializeAsV31(IOpenApiWriter writer)
65-
{
66-
if (!writer.GetSettings().ShouldInlineReference(Reference))
67-
{
68-
Reference.SerializeAsV31(writer);
69-
}
70-
else
71-
{
72-
SerializeInternal(writer, (writer, element) => element.SerializeAsV31(writer));
73-
}
74-
}
75-
7650
/// <inheritdoc/>
7751
public override IOpenApiCallback CopyReferenceAsTargetElementWithOverrides(IOpenApiCallback source)
7852
{
79-
// the copy here is never called since callbacks do not have any overridable fields.
80-
// if the spec evolves to include overridable fields for callbacks, the serialize methods will need to call this copy method.
8153
return source is OpenApiCallback ? new OpenApiCallback(this) : source;
8254
}
8355

‎src/Microsoft.OpenApi/Models/References/OpenApiExampleReference.cs

-26
Original file line numberDiff line numberDiff line change
@@ -76,32 +76,6 @@ public string Summary
7676
/// <inheritdoc/>
7777
public JsonNode Value { get => Target?.Value; }
7878

79-
/// <inheritdoc/>
80-
public override void SerializeAsV3(IOpenApiWriter writer)
81-
{
82-
if (!writer.GetSettings().ShouldInlineReference(Reference))
83-
{
84-
Reference.SerializeAsV3(writer);
85-
}
86-
else
87-
{
88-
SerializeInternal(writer, (writer, referenceElement) => CopyReferenceAsTargetElementWithOverrides(referenceElement).SerializeAsV3(writer));
89-
}
90-
}
91-
92-
/// <inheritdoc/>
93-
public override void SerializeAsV31(IOpenApiWriter writer)
94-
{
95-
if (!writer.GetSettings().ShouldInlineReference(Reference))
96-
{
97-
Reference.SerializeAsV31(writer);
98-
}
99-
else
100-
{
101-
SerializeInternal(writer, (writer, referenceElement) => CopyReferenceAsTargetElementWithOverrides(referenceElement).SerializeAsV31(writer));
102-
}
103-
}
104-
10579
/// <inheritdoc/>
10680
public override IOpenApiExample CopyReferenceAsTargetElementWithOverrides(IOpenApiExample source)
10781
{

‎src/Microsoft.OpenApi/Models/References/OpenApiHeaderReference.cs

-38
Original file line numberDiff line numberDiff line change
@@ -87,44 +87,6 @@ public string Description
8787
/// <inheritdoc/>
8888
public IDictionary<string, IOpenApiExtension> Extensions { get => Target?.Extensions; }
8989

90-
/// <inheritdoc/>
91-
public override void SerializeAsV31(IOpenApiWriter writer)
92-
{
93-
if (!writer.GetSettings().ShouldInlineReference(Reference))
94-
{
95-
Reference.SerializeAsV31(writer);
96-
}
97-
else
98-
{
99-
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV31(writer));
100-
}
101-
}
102-
103-
/// <inheritdoc/>
104-
public override void SerializeAsV3(IOpenApiWriter writer)
105-
{
106-
if (!writer.GetSettings().ShouldInlineReference(Reference))
107-
{
108-
Reference.SerializeAsV3(writer);
109-
}
110-
else
111-
{
112-
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV3(writer));
113-
}
114-
}
115-
116-
/// <inheritdoc/>
117-
public override void SerializeAsV2(IOpenApiWriter writer)
118-
{
119-
if (!writer.GetSettings().ShouldInlineReference(Reference))
120-
{
121-
Reference.SerializeAsV2(writer);
122-
}
123-
else
124-
{
125-
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV2(writer));
126-
}
127-
}
12890
/// <inheritdoc/>
12991
public override IOpenApiHeader CopyReferenceAsTargetElementWithOverrides(IOpenApiHeader source)
13092
{

‎src/Microsoft.OpenApi/Models/References/OpenApiLinkReference.cs

-26
Original file line numberDiff line numberDiff line change
@@ -69,32 +69,6 @@ public string Description
6969
/// <inheritdoc/>
7070
public IDictionary<string, IOpenApiExtension> Extensions { get => Target?.Extensions; }
7171

72-
/// <inheritdoc/>
73-
public override void SerializeAsV3(IOpenApiWriter writer)
74-
{
75-
if (!writer.GetSettings().ShouldInlineReference(Reference))
76-
{
77-
Reference.SerializeAsV3(writer);
78-
}
79-
else
80-
{
81-
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV3(writer));
82-
}
83-
}
84-
85-
/// <inheritdoc/>
86-
public override void SerializeAsV31(IOpenApiWriter writer)
87-
{
88-
if (!writer.GetSettings().ShouldInlineReference(Reference))
89-
{
90-
Reference.SerializeAsV31(writer);
91-
}
92-
else
93-
{
94-
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV31(writer));
95-
}
96-
}
97-
9872
/// <inheritdoc/>
9973
public override void SerializeAsV2(IOpenApiWriter writer)
10074
{

‎src/Microsoft.OpenApi/Models/References/OpenApiParameterReference.cs

-41
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4-
using System;
54
using System.Collections.Generic;
65
using System.Text.Json.Nodes;
76
using Microsoft.OpenApi.Interfaces;
87
using Microsoft.OpenApi.Models.Interfaces;
9-
using Microsoft.OpenApi.Writers;
108

119
namespace Microsoft.OpenApi.Models.References
1210
{
@@ -93,45 +91,6 @@ public string Description
9391
/// <inheritdoc/>
9492
public IDictionary<string, IOpenApiExtension> Extensions { get => Target.Extensions; }
9593

96-
/// <inheritdoc/>
97-
public override void SerializeAsV3(IOpenApiWriter writer)
98-
{
99-
if (!writer.GetSettings().ShouldInlineReference(Reference))
100-
{
101-
Reference.SerializeAsV3(writer);
102-
}
103-
else
104-
{
105-
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV3(writer));
106-
}
107-
}
108-
109-
/// <inheritdoc/>
110-
public override void SerializeAsV31(IOpenApiWriter writer)
111-
{
112-
if (!writer.GetSettings().ShouldInlineReference(Reference))
113-
{
114-
Reference.SerializeAsV31(writer);
115-
}
116-
else
117-
{
118-
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV31(writer));
119-
}
120-
}
121-
122-
/// <inheritdoc/>
123-
public override void SerializeAsV2(IOpenApiWriter writer)
124-
{
125-
if (!writer.GetSettings().ShouldInlineReference(Reference))
126-
{
127-
Reference.SerializeAsV2(writer);
128-
}
129-
else
130-
{
131-
SerializeInternal(writer, (writer, element) => CopyReferenceAsTargetElementWithOverrides(element).SerializeAsV2(writer));
132-
}
133-
}
134-
13594
/// <inheritdoc/>
13695
public override IOpenApiParameter CopyReferenceAsTargetElementWithOverrides(IOpenApiParameter source)
13796
{

‎test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt

+4-15
Original file line numberDiff line numberDiff line change
@@ -1157,16 +1157,17 @@ namespace Microsoft.OpenApi.Models.References
11571157
{
11581158
public abstract class BaseOpenApiReferenceHolder<T, V> : Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder<T>, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder<T, V>, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
11591159
where T : class, Microsoft.OpenApi.Interfaces.IOpenApiReferenceable, V
1160+
where V : Microsoft.OpenApi.Interfaces.IOpenApiSerializable
11601161
{
11611162
protected BaseOpenApiReferenceHolder(Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder<T, V> source) { }
11621163
protected BaseOpenApiReferenceHolder(string referenceId, Microsoft.OpenApi.Models.OpenApiDocument hostDocument, Microsoft.OpenApi.Models.ReferenceType referenceType, string externalResource = null) { }
11631164
public Microsoft.OpenApi.Models.OpenApiReference Reference { get; set; }
11641165
public T Target { get; }
11651166
public bool UnresolvedReference { get; set; }
11661167
public abstract V CopyReferenceAsTargetElementWithOverrides(V source);
1167-
public abstract void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer);
1168-
public abstract void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer);
1169-
public abstract void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer);
1168+
public virtual void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1169+
public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1170+
public void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
11701171
}
11711172
public class OpenApiCallbackReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder<Microsoft.OpenApi.Models.OpenApiCallback, Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback>, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback
11721173
{
@@ -1176,8 +1177,6 @@ namespace Microsoft.OpenApi.Models.References
11761177
public System.Collections.Generic.Dictionary<Microsoft.OpenApi.Expressions.RuntimeExpression, Microsoft.OpenApi.Models.OpenApiPathItem> PathItems { get; }
11771178
public override Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiCallback source) { }
11781179
public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1179-
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1180-
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
11811180
}
11821181
public class OpenApiExampleReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder<Microsoft.OpenApi.Models.OpenApiExample, Microsoft.OpenApi.Models.Interfaces.IOpenApiExample>, 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
11831182
{
@@ -1190,8 +1189,6 @@ namespace Microsoft.OpenApi.Models.References
11901189
public System.Text.Json.Nodes.JsonNode Value { get; }
11911190
public override Microsoft.OpenApi.Models.Interfaces.IOpenApiExample CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiExample source) { }
11921191
public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1193-
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1194-
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
11951192
}
11961193
public class OpenApiHeaderReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder<Microsoft.OpenApi.Models.OpenApiHeader, Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader>, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader
11971194
{
@@ -1210,9 +1207,6 @@ namespace Microsoft.OpenApi.Models.References
12101207
public Microsoft.OpenApi.Models.OpenApiSchema Schema { get; }
12111208
public Microsoft.OpenApi.Models.ParameterStyle? Style { get; }
12121209
public override Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiHeader source) { }
1213-
public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1214-
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1215-
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
12161210
}
12171211
public class OpenApiLinkReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder<Microsoft.OpenApi.Models.OpenApiLink, Microsoft.OpenApi.Models.Interfaces.IOpenApiLink>, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiLink
12181212
{
@@ -1227,8 +1221,6 @@ namespace Microsoft.OpenApi.Models.References
12271221
public Microsoft.OpenApi.Models.OpenApiServer Server { get; }
12281222
public override Microsoft.OpenApi.Models.Interfaces.IOpenApiLink CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiLink source) { }
12291223
public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1230-
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1231-
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
12321224
}
12331225
public class OpenApiParameterReference : Microsoft.OpenApi.Models.References.BaseOpenApiReferenceHolder<Microsoft.OpenApi.Models.OpenApiParameter, Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter>, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.Interfaces.IOpenApiSerializable, Microsoft.OpenApi.Models.Interfaces.IOpenApiDescribedElement, Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter
12341226
{
@@ -1249,9 +1241,6 @@ namespace Microsoft.OpenApi.Models.References
12491241
public Microsoft.OpenApi.Models.OpenApiSchema Schema { get; }
12501242
public Microsoft.OpenApi.Models.ParameterStyle? Style { get; }
12511243
public override Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter CopyReferenceAsTargetElementWithOverrides(Microsoft.OpenApi.Models.Interfaces.IOpenApiParameter source) { }
1252-
public override void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1253-
public override void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
1254-
public override void SerializeAsV31(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { }
12551244
}
12561245
public class OpenApiPathItemReference : Microsoft.OpenApi.Models.OpenApiPathItem, Microsoft.OpenApi.Interfaces.IOpenApiElement, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder, Microsoft.OpenApi.Interfaces.IOpenApiReferenceHolder<Microsoft.OpenApi.Models.OpenApiPathItem>, Microsoft.OpenApi.Interfaces.IOpenApiSerializable
12571246
{

0 commit comments

Comments
 (0)
Please sign in to comment.