Skip to content

Commit 0a686fd

Browse files
committed
chore: fixes the reference copy conundrum
Signed-off-by: Vincent Biret <[email protected]>
1 parent 4139170 commit 0a686fd

13 files changed

+89
-33
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ public T? RecursiveTarget
3030
};
3131
}
3232
}
33+
/// <summary>
34+
/// Copy the reference as a target element with overrides.
35+
/// </summary>
36+
/// <param name="sourceReference">The source reference to copy</param>
37+
/// <returns>The copy of the reference</returns>
38+
protected abstract V CopyReference(V sourceReference);
3339

3440
/// <summary>
3541
/// Copy constructor
@@ -38,7 +44,7 @@ public T? RecursiveTarget
3844
protected BaseOpenApiReferenceHolder(BaseOpenApiReferenceHolder<T, U, V> source)
3945
{
4046
Utils.CheckArgumentNull(source);
41-
Reference = new(source.Reference);
47+
Reference = CopyReference(source.Reference);
4248
//no need to copy summary and description as if they are not overridden, they will be fetched from the target
4349
//if they are, the reference copy will handle it
4450
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ public class OpenApiCallbackReference : BaseOpenApiReferenceHolder<OpenApiCallba
2020
/// 1. an absolute/relative file path, for example: ../commons/pet.json
2121
/// 2. a Url, for example: http://localhost/pet.json
2222
/// </param>
23-
public OpenApiCallbackReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null):base(referenceId, hostDocument, ReferenceType.Callback, externalResource)
23+
public OpenApiCallbackReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null) : base(referenceId, hostDocument, ReferenceType.Callback, externalResource)
2424
{
2525
}
2626
/// <summary>
2727
/// Copy constructor
2828
/// </summary>
2929
/// <param name="callback">The reference to copy</param>
30-
private OpenApiCallbackReference(OpenApiCallbackReference callback):base(callback)
30+
private OpenApiCallbackReference(OpenApiCallbackReference callback) : base(callback)
3131
{
32-
32+
3333
}
3434

3535
/// <inheritdoc/>
@@ -56,5 +56,10 @@ public IOpenApiCallback CreateShallowCopy()
5656
{
5757
return new OpenApiCallbackReference(this);
5858
}
59+
/// <inheritdoc/>
60+
protected override OpenApiReference CopyReference(OpenApiReference sourceReference)
61+
{
62+
return new OpenApiReference(sourceReference);
63+
}
5964
}
6065
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ public class OpenApiExampleReference : BaseOpenApiReferenceHolder<OpenApiExample
2121
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2222
/// 2. a Url, for example: http://localhost/pet.json
2323
/// </param>
24-
public OpenApiExampleReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null):base(referenceId, hostDocument, ReferenceType.Example, externalResource)
24+
public OpenApiExampleReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null) : base(referenceId, hostDocument, ReferenceType.Example, externalResource)
2525
{
2626
}
2727
/// <summary>
2828
/// Copy constructor
2929
/// </summary>
3030
/// <param name="example">The example reference to copy</param>
31-
private OpenApiExampleReference(OpenApiExampleReference example):base(example)
31+
private OpenApiExampleReference(OpenApiExampleReference example) : base(example)
3232
{
3333
}
3434

@@ -73,5 +73,10 @@ public IOpenApiExample CreateShallowCopy()
7373
{
7474
return new OpenApiExampleReference(this);
7575
}
76+
/// <inheritdoc/>
77+
protected override OpenApiReference CopyReference(OpenApiReference sourceReference)
78+
{
79+
return new OpenApiReference(sourceReference);
80+
}
7681
}
7782
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ public class OpenApiHeaderReference : BaseOpenApiReferenceHolder<OpenApiHeader,
2121
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2222
/// 2. a Url, for example: http://localhost/pet.json
2323
/// </param>
24-
public OpenApiHeaderReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null):base(referenceId, hostDocument, ReferenceType.Header, externalResource)
24+
public OpenApiHeaderReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null) : base(referenceId, hostDocument, ReferenceType.Header, externalResource)
2525
{
2626
}
2727

2828
/// <summary>
2929
/// Copy constructor
3030
/// </summary>
3131
/// <param name="header">The <see cref="OpenApiHeaderReference"/> object to copy</param>
32-
private OpenApiHeaderReference(OpenApiHeaderReference header):base(header)
32+
private OpenApiHeaderReference(OpenApiHeaderReference header) : base(header)
3333
{
3434
}
3535

@@ -84,5 +84,10 @@ public IOpenApiHeader CreateShallowCopy()
8484
{
8585
return new OpenApiHeaderReference(this);
8686
}
87+
/// <inheritdoc/>
88+
protected override OpenApiReference CopyReference(OpenApiReference sourceReference)
89+
{
90+
return new OpenApiReference(sourceReference);
91+
}
8792
}
8893
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ public class OpenApiLinkReference : BaseOpenApiReferenceHolder<OpenApiLink, IOpe
2020
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2121
/// 2. a Url, for example: http://localhost/pet.json
2222
/// </param>
23-
public OpenApiLinkReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null):base(referenceId, hostDocument, ReferenceType.Link, externalResource)
23+
public OpenApiLinkReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null) : base(referenceId, hostDocument, ReferenceType.Link, externalResource)
2424
{
2525
}
2626
/// <summary>
2727
/// Copy constructor.
2828
/// </summary>
2929
/// <param name="reference">The reference to copy</param>
30-
private OpenApiLinkReference(OpenApiLinkReference reference):base(reference)
30+
private OpenApiLinkReference(OpenApiLinkReference reference) : base(reference)
3131
{
3232
}
3333

@@ -73,5 +73,10 @@ public IOpenApiLink CreateShallowCopy()
7373
{
7474
return new OpenApiLinkReference(this);
7575
}
76+
/// <inheritdoc/>
77+
protected override OpenApiReference CopyReference(OpenApiReference sourceReference)
78+
{
79+
return new OpenApiReference(sourceReference);
80+
}
7681
}
7782
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,11 @@ public IOpenApiParameter CreateShallowCopy()
9090
{
9191
return new OpenApiParameterReference(this);
9292
}
93+
94+
/// <inheritdoc/>
95+
protected override OpenApiReference CopyReference(OpenApiReference sourceReference)
96+
{
97+
return new OpenApiReference(sourceReference);
98+
}
9399
}
94100
}

src/Microsoft.OpenApi/Models/References/OpenApiPathItemReference.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ public class OpenApiPathItemReference : BaseOpenApiReferenceHolder<OpenApiPathIt
2222
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2323
/// 2. a Url, for example: http://localhost/pet.json
2424
/// </param>
25-
public OpenApiPathItemReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null): base(referenceId, hostDocument, ReferenceType.PathItem, externalResource)
25+
public OpenApiPathItemReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null) : base(referenceId, hostDocument, ReferenceType.PathItem, externalResource)
2626
{
2727
}
2828

2929
/// <summary>
3030
/// Copy constructor
3131
/// </summary>
3232
/// <param name="pathItem">The reference to copy</param>
33-
private OpenApiPathItemReference(OpenApiPathItemReference pathItem):base(pathItem)
33+
private OpenApiPathItemReference(OpenApiPathItemReference pathItem) : base(pathItem)
3434
{
35-
35+
3636
}
3737

3838
/// <inheritdoc/>
@@ -78,5 +78,10 @@ public override void SerializeAsV2(IOpenApiWriter writer)
7878
{
7979
Reference.SerializeAsV2(writer);
8080
}
81+
/// <inheritdoc/>
82+
protected override OpenApiReference CopyReference(OpenApiReference sourceReference)
83+
{
84+
return new OpenApiReference(sourceReference);
85+
}
8186
}
8287
}

src/Microsoft.OpenApi/Models/References/OpenApiRequestBodyReference.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ public class OpenApiRequestBodyReference : BaseOpenApiReferenceHolder<OpenApiReq
2121
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2222
/// 2. a Url, for example: http://localhost/pet.json
2323
/// </param>
24-
public OpenApiRequestBodyReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null):base(referenceId, hostDocument, ReferenceType.RequestBody, externalResource)
24+
public OpenApiRequestBodyReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null) : base(referenceId, hostDocument, ReferenceType.RequestBody, externalResource)
2525
{
2626
}
2727
/// <summary>
2828
/// Copy constructor
2929
/// </summary>
3030
/// <param name="openApiRequestBodyReference">The reference to copy</param>
31-
private OpenApiRequestBodyReference(OpenApiRequestBodyReference openApiRequestBodyReference):base(openApiRequestBodyReference)
31+
private OpenApiRequestBodyReference(OpenApiRequestBodyReference openApiRequestBodyReference) : base(openApiRequestBodyReference)
3232
{
33-
33+
3434
}
3535

3636
/// <inheritdoc/>
@@ -88,5 +88,10 @@ public IOpenApiRequestBody CreateShallowCopy()
8888
{
8989
return new OpenApiRequestBodyReference(this);
9090
}
91+
/// <inheritdoc/>
92+
protected override OpenApiReference CopyReference(OpenApiReference sourceReference)
93+
{
94+
return new OpenApiReference(sourceReference);
95+
}
9196
}
9297
}

src/Microsoft.OpenApi/Models/References/OpenApiResponseReference.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ public class OpenApiResponseReference : BaseOpenApiReferenceHolder<OpenApiRespon
2020
/// 1. a absolute/relative file path, for example: ../commons/pet.json
2121
/// 2. a Url, for example: http://localhost/pet.json
2222
/// </param>
23-
public OpenApiResponseReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null):base(referenceId, hostDocument, ReferenceType.Response, externalResource)
23+
public OpenApiResponseReference(string referenceId, OpenApiDocument? hostDocument = null, string? externalResource = null) : base(referenceId, hostDocument, ReferenceType.Response, externalResource)
2424
{
2525
}
2626
/// <summary>
2727
/// Copy constructor
2828
/// </summary>
2929
/// <param name="openApiResponseReference">The reference to copy</param>
30-
private OpenApiResponseReference(OpenApiResponseReference openApiResponseReference):base(openApiResponseReference)
30+
private OpenApiResponseReference(OpenApiResponseReference openApiResponseReference) : base(openApiResponseReference)
3131
{
32-
32+
3333
}
3434

3535
/// <inheritdoc/>
@@ -62,5 +62,10 @@ public IOpenApiResponse CreateShallowCopy()
6262
{
6363
return new OpenApiResponseReference(this);
6464
}
65+
/// <inheritdoc/>
66+
protected override OpenApiReference CopyReference(OpenApiReference sourceReference)
67+
{
68+
return new OpenApiReference(sourceReference);
69+
}
6570
}
6671
}

src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public bool Deprecated
167167
/// <inheritdoc/>
168168
public override void SerializeAsV31(IOpenApiWriter writer)
169169
{
170-
SerializeAsWithoutLoops(writer, (w, element) =>
170+
SerializeAsWithoutLoops(writer, (w, element) =>
171171
{
172172
if (element is IOpenApiSchema s)
173173
{
@@ -223,5 +223,10 @@ public IOpenApiSchema CreateShallowCopy()
223223
{
224224
return new OpenApiSchemaReference(this);
225225
}
226+
/// <inheritdoc/>
227+
protected override JsonSchemaReference CopyReference(JsonSchemaReference sourceReference)
228+
{
229+
return new JsonSchemaReference(sourceReference);
230+
}
226231
}
227232
}

0 commit comments

Comments
 (0)