Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 26 additions & 10 deletions src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,33 +7,36 @@
using Microsoft.OpenApi.Exceptions;
using Microsoft.OpenApi.Interfaces;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Services;

namespace Microsoft.OpenApi.Services
{
/// <summary>
/// This class is used to walk an OpenApiDocument and convert unresolved references to references to populated objects
/// </summary>
internal class OpenApiReferenceResolver : OpenApiVisitorBase
public class OpenApiReferenceResolver : OpenApiVisitorBase
{
private OpenApiDocument _currentDocument;
private bool _resolveRemoteReferences;
private readonly bool _resolveRemoteReferences;
private List<OpenApiError> _errors = new List<OpenApiError>();

/// <summary>
/// Initializes the <see cref="OpenApiReferenceResolver"/> class.
/// </summary>
public OpenApiReferenceResolver(OpenApiDocument currentDocument, bool resolveRemoteReferences = true)
{
_currentDocument = currentDocument;
_resolveRemoteReferences = resolveRemoteReferences;
}

public IEnumerable<OpenApiError> Errors
{
get
{
return _errors;
}
}
/// <summary>
/// List of errors related to the OpenApiDocument
/// </summary>
public IEnumerable<OpenApiError> Errors => _errors;

/// <summary>
/// Resolves tags in OpenApiDocument
/// </summary>
/// <param name="doc"></param>
public override void Visit(OpenApiDocument doc)
{
if (doc.Tags != null)
Expand All @@ -42,13 +45,22 @@ public override void Visit(OpenApiDocument doc)
}
}

/// <summary>
/// Visits the referenceable element in the host document
/// </summary>
/// <param name="referenceable">The referenceable element in the doc.</param>
public override void Visit(IOpenApiReferenceable referenceable)
{
if (referenceable.Reference != null)
{
referenceable.Reference.HostDocument = _currentDocument;
}
}

/// <summary>
/// Resolves references in components
/// </summary>
/// <param name="components"></param>
public override void Visit(OpenApiComponents components)
{
ResolveMap(components.Parameters);
Expand All @@ -62,6 +74,10 @@ public override void Visit(OpenApiComponents components)
ResolveMap(components.Headers);
}

/// <summary>
/// Resolves all references used in callbacks
/// </summary>
/// <param name="callbacks"></param>
public override void Visit(IDictionary<string, OpenApiCallback> callbacks)
{
ResolveMap(callbacks);
Expand Down
19 changes: 19 additions & 0 deletions test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1067,6 +1067,25 @@ namespace Microsoft.OpenApi.Services
public OpenApiReferenceError(Microsoft.OpenApi.Exceptions.OpenApiException exception) { }
public OpenApiReferenceError(Microsoft.OpenApi.Models.OpenApiReference reference, string message) { }
}
public class OpenApiReferenceResolver : Microsoft.OpenApi.Services.OpenApiVisitorBase
{
public OpenApiReferenceResolver(Microsoft.OpenApi.Models.OpenApiDocument currentDocument, bool resolveRemoteReferences = true) { }
public System.Collections.Generic.IEnumerable<Microsoft.OpenApi.Models.OpenApiError> Errors { get; }
public override void Visit(Microsoft.OpenApi.Interfaces.IOpenApiReferenceable referenceable) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiComponents components) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiDocument doc) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiMediaType mediaType) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiOperation operation) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiParameter parameter) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiResponses responses) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiSchema schema) { }
public override void Visit(Microsoft.OpenApi.Models.OpenApiSecurityRequirement securityRequirement) { }
public override void Visit(System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.Models.OpenApiCallback> callbacks) { }
public override void Visit(System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.Models.OpenApiExample> examples) { }
public override void Visit(System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.Models.OpenApiHeader> headers) { }
public override void Visit(System.Collections.Generic.IDictionary<string, Microsoft.OpenApi.Models.OpenApiLink> links) { }
public override void Visit(System.Collections.Generic.IList<Microsoft.OpenApi.Models.OpenApiParameter> parameters) { }
}
public class OpenApiUrlTreeNode
{
public System.Collections.Generic.IDictionary<string, System.Collections.Generic.List<string>> AdditionalData { get; set; }
Expand Down