Skip to content

Commit ffb083c

Browse files
committed
chore: cleans up interface definitions
Signed-off-by: Vincent Biret <[email protected]>
1 parent f0802e5 commit ffb083c

File tree

5 files changed

+47
-28
lines changed

5 files changed

+47
-28
lines changed

src/Microsoft.OpenApi/Interfaces/IOpenApiReferenceHolder.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,44 @@ namespace Microsoft.OpenApi
77
/// A generic interface for OpenApiReferenceable objects that have a target.
88
/// </summary>
99
/// <typeparam name="T">The type of the target being referenced</typeparam>
10-
/// <typeparam name="V">The type of the interface implemented by both the target and the reference type</typeparam>
11-
/// <typeparam name="U">The type for the reference holding the additional fields and annotations</typeparam>
12-
public interface IOpenApiReferenceHolder<out T, V, U> : IOpenApiReferenceHolder<U> where T : IOpenApiReferenceable, V where U : OpenApiReference
10+
/// <typeparam name="U">The type of the interface implemented by both the target and the reference type</typeparam>
11+
/// <typeparam name="V">The type for the reference holding the additional fields and annotations</typeparam>
12+
public interface IOpenApiReferenceHolder<out T, U, V> : IOpenApiReferenceHolder<V> where T : IOpenApiReferenceable, U where V : OpenApiReference, new()
1313
{
1414
/// <summary>
1515
/// Gets the resolved target object.
1616
/// </summary>
17-
V? Target { get; }
18-
17+
U? Target { get; }
18+
1919
/// <summary>
2020
/// Gets the recursively resolved target object.
2121
/// </summary>
2222
T? RecursiveTarget { get; }
23-
23+
2424
/// <summary>
2525
/// Copy the reference as a target element with overrides.
2626
/// </summary>
27-
V CopyReferenceAsTargetElementWithOverrides(V source);
27+
U CopyReferenceAsTargetElementWithOverrides(U source);
2828
}
2929
/// <summary>
3030
/// A generic interface for OpenApiReferenceable objects that have a target.
3131
/// </summary>
32-
public interface IOpenApiReferenceHolder<U> : IOpenApiSerializable where U : OpenApiReference
32+
/// <typeparam name="V">The type for the reference holding the additional fields and annotations</typeparam>
33+
public interface IOpenApiReferenceHolder<V> : IOpenApiReferenceHolder where V : OpenApiReference, new()
3334
{
3435
/// <summary>
35-
/// Indicates if object is populated with data or is just a reference to the data
36+
/// Reference object.
3637
/// </summary>
37-
bool UnresolvedReference { get; }
38-
38+
V Reference { get; init; }
39+
}
40+
/// <summary>
41+
/// A generic interface for OpenApiReferenceable objects that have a target.
42+
/// </summary>
43+
public interface IOpenApiReferenceHolder : IOpenApiSerializable
44+
{
3945
/// <summary>
40-
/// Reference object.
46+
/// Indicates if object is populated with data or is just a reference to the data
4147
/// </summary>
42-
U Reference { get; init; }
48+
bool UnresolvedReference { get; }
4349
}
4450
}

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ namespace Microsoft.OpenApi;
55
/// Base class for OpenApiReferenceHolder.
66
/// </summary>
77
/// <typeparam name="T">The concrete class implementation type for the model.</typeparam>
8-
/// <typeparam name="V">The interface type for the model.</typeparam>
9-
/// <typeparam name="U">The type for the reference holding the additional fields and annotations</typeparam>
10-
public abstract class BaseOpenApiReferenceHolder<T, V, U> : IOpenApiReferenceHolder<T, V, U> where T : class, IOpenApiReferenceable, V where V : IOpenApiReferenceable, IOpenApiSerializable where U : OpenApiReference, new()
8+
/// <typeparam name="U">The interface type for the model.</typeparam>
9+
/// <typeparam name="V">The type for the reference holding the additional fields and annotations</typeparam>
10+
public abstract class BaseOpenApiReferenceHolder<T, U, V> : IOpenApiReferenceHolder<T, U, V> where T : class, IOpenApiReferenceable, U where U : IOpenApiReferenceable, IOpenApiSerializable where V : OpenApiReference, new()
1111
{
1212
/// <inheritdoc/>
13-
public virtual V? Target
13+
public virtual U? Target
1414
{
1515
get
1616
{
1717
if (Reference.HostDocument is null) return default;
18-
return Reference.HostDocument.ResolveReferenceTo<V>(Reference);
18+
return Reference.HostDocument.ResolveReferenceTo<U>(Reference);
1919
}
2020
}
2121
/// <inheritdoc/>
@@ -24,7 +24,7 @@ public T? RecursiveTarget
2424
get
2525
{
2626
return Target switch {
27-
BaseOpenApiReferenceHolder<T, V, U> recursiveTarget => recursiveTarget.RecursiveTarget,
27+
BaseOpenApiReferenceHolder<T, U, V> recursiveTarget => recursiveTarget.RecursiveTarget,
2828
T concrete => concrete,
2929
_ => null
3030
};
@@ -35,7 +35,7 @@ public T? RecursiveTarget
3535
/// Copy constructor
3636
/// </summary>
3737
/// <param name="source">The parameter reference to copy</param>
38-
protected BaseOpenApiReferenceHolder(BaseOpenApiReferenceHolder<T, V, U> source)
38+
protected BaseOpenApiReferenceHolder(BaseOpenApiReferenceHolder<T, U, V> source)
3939
{
4040
Utils.CheckArgumentNull(source);
4141
Reference = new(source.Reference);
@@ -59,7 +59,7 @@ protected BaseOpenApiReferenceHolder(string referenceId, OpenApiDocument? hostDo
5959
// we're not checking for null hostDocument as it's optional and can be set via additional methods by a walker
6060
// this way object initialization of a whole document is supported
6161

62-
Reference = new U()
62+
Reference = new V()
6363
{
6464
Id = referenceId,
6565
HostDocument = hostDocument,
@@ -75,10 +75,10 @@ protected BaseOpenApiReferenceHolder(string referenceId, OpenApiDocument? hostDo
7575
public required U Reference { get; init; }
7676
#else
7777
/// <inheritdoc/>
78-
public U Reference { get; init; }
78+
public V Reference { get; init; }
7979
#endif
8080
/// <inheritdoc/>
81-
public abstract V CopyReferenceAsTargetElementWithOverrides(V source);
81+
public abstract U CopyReferenceAsTargetElementWithOverrides(U source);
8282
/// <inheritdoc/>
8383
public virtual void SerializeAsV3(IOpenApiWriter writer)
8484
{
@@ -126,7 +126,7 @@ public virtual void SerializeAsV2(IOpenApiWriter writer)
126126
/// <param name="writer">The OpenApiWriter.</param>
127127
/// <param name="action">The action to serialize the target object.</param>
128128
private protected void SerializeInternal(IOpenApiWriter writer,
129-
Action<IOpenApiWriter, V> action)
129+
Action<IOpenApiWriter, U> action)
130130
{
131131
Utils.CheckArgumentNull(writer);
132132
if (Target is not null)

src/Microsoft.OpenApi/Reader/Services/OpenApiRemoteReferenceCollector.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,14 @@ public IEnumerable<OpenApiReference> References
2626
/// <inheritdoc/>
2727
public override void Visit(IOpenApiReferenceHolder referenceHolder)
2828
{
29-
AddExternalReferences(referenceHolder.Reference);
29+
if (referenceHolder is IOpenApiReferenceHolder<OpenApiReference> { Reference: OpenApiReference reference })
30+
{
31+
AddExternalReferences(reference);
32+
}
33+
else if (referenceHolder is IOpenApiReferenceHolder<JsonSchemaReference> { Reference: JsonSchemaReference jsonSchemaReference })
34+
{
35+
AddExternalReferences(jsonSchemaReference);
36+
}
3037
}
3138

3239
/// <summary>

src/Microsoft.OpenApi/Services/OpenApiWalker.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,8 +1262,7 @@ private void Walk(string context, Action walk)
12621262
/// </summary>
12631263
private bool ProcessAsReference(IOpenApiReferenceHolder referenceableHolder, bool isComponent = false)
12641264
{
1265-
var isReference = referenceableHolder.Reference != null &&
1266-
(!isComponent || referenceableHolder.UnresolvedReference);
1265+
var isReference = !isComponent || referenceableHolder.UnresolvedReference;
12671266
if (isReference)
12681267
{
12691268
Walk(referenceableHolder);

src/Microsoft.OpenApi/Services/ReferenceHostDocumentSetter.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ public ReferenceHostDocumentSetter(OpenApiDocument currentDocument)
1818
/// <inheritdoc/>
1919
public override void Visit(IOpenApiReferenceHolder referenceHolder)
2020
{
21-
referenceHolder.Reference?.EnsureHostDocumentIsSet(_currentDocument);
21+
if (referenceHolder is IOpenApiReferenceHolder<OpenApiReference> { Reference: OpenApiReference reference })
22+
{
23+
reference.EnsureHostDocumentIsSet(_currentDocument);
24+
}
25+
else if (referenceHolder is IOpenApiReferenceHolder<JsonSchemaReference> { Reference: JsonSchemaReference jsonSchemaReference })
26+
{
27+
jsonSchemaReference.EnsureHostDocumentIsSet(_currentDocument);
28+
}
2229
}
2330
}
2431
}

0 commit comments

Comments
 (0)