diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 8e5cb1f51..b972c9848 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -14,7 +14,7 @@ jobs: GITHUB_RUN_NUMBER: ${{ github.run_number }} steps: - name: Setup .NET - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: dotnet-version: 6.0.x diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 8b965b442..eb56ea14f 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v3 - name: Setup .NET - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: dotnet-version: 6.0.x diff --git a/Microsoft.OpenApi.sln b/Microsoft.OpenApi.sln index 157cb18ff..bb3c028e7 100644 --- a/Microsoft.OpenApi.sln +++ b/Microsoft.OpenApi.sln @@ -28,7 +28,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.OpenApi.SmokeTest EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.OpenApi.Hidi", "src\Microsoft.OpenApi.Hidi\Microsoft.OpenApi.Hidi.csproj", "{254841B5-7DAC-4D1D-A9C5-44FE5CE467BE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.OpenApi.Hidi.Tests", "Microsoft.OpenApi.Hidi.Tests\Microsoft.OpenApi.Hidi.Tests.csproj", "{D8F799DD-04AC-4A13-B344-45A5B944450A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.OpenApi.Hidi.Tests", "test\Microsoft.OpenApi.Hidi.Tests\Microsoft.OpenApi.Hidi.Tests.csproj", "{D8F799DD-04AC-4A13-B344-45A5B944450A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj index fbb16de3f..55d529a06 100644 --- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj +++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj @@ -15,7 +15,7 @@ Microsoft.OpenApi.Hidi hidi ./../../artifacts - 1.1.0-preview1 + 1.1.0-preview2 OpenAPI.NET CLI tool for slicing OpenAPI documents © Microsoft Corporation. All rights reserved. OpenAPI .NET @@ -43,7 +43,7 @@ - + diff --git a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj index a3227eac0..d21c300eb 100644 --- a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj +++ b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj @@ -10,7 +10,7 @@ Microsoft Microsoft.OpenApi.Readers Microsoft.OpenApi.Readers - 1.4.1 + 1.4.4-preview1 OpenAPI.NET Readers for JSON and YAML documents © Microsoft Corporation. All rights reserved. OpenAPI .NET diff --git a/src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs b/src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs index 32caf86aa..5d6cc2ff3 100644 --- a/src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs +++ b/src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; @@ -139,8 +139,12 @@ internal static partial class OpenApiV2Deserializer { OpenApiConstants.Default, new AnyFieldMapParameter( - p => p.Schema.Default, - (p, v) => p.Schema.Default = v, + p => p.Schema?.Default, + (p, v) => + { + if(p.Schema == null) return; + p.Schema.Default = v; + }, p => p.Schema) } }; @@ -151,8 +155,12 @@ internal static partial class OpenApiV2Deserializer { OpenApiConstants.Enum, new AnyListFieldMapParameter( - p => p.Schema.Enum, - (p, v) => p.Schema.Enum = v, + p => p.Schema?.Enum, + (p, v) => + { + if(p.Schema == null) return; + p.Schema.Enum = v; + }, p => p.Schema) }, }; diff --git a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj index 233d0717e..1affa74c6 100644 --- a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj +++ b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj @@ -11,7 +11,7 @@ Microsoft Microsoft.OpenApi Microsoft.OpenApi - 1.4.3 + 1.4.4-preview1 .NET models with JSON and YAML writers for OpenAPI specification © Microsoft Corporation. All rights reserved. OpenAPI .NET diff --git a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs index 93d88b310..5177e4f45 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDocument.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDocument.cs @@ -160,7 +160,7 @@ public void SerializeAsV2(IOpenApiWriter writer) // paths writer.WriteRequiredObject(OpenApiConstants.Paths, Paths, (w, p) => p.SerializeAsV2(w)); - // If references have been inlined we don't need the to render the components section + // If references have been inlined we don't need to render the components section // however if they have cycles, then we will need a component rendered if (writer.GetSettings().InlineLocalReferences) { @@ -208,9 +208,20 @@ public void SerializeAsV2(IOpenApiWriter writer) }); } // parameters + var parameters = Components?.Parameters != null + ? new Dictionary(Components.Parameters) + : new Dictionary(); + + if (Components?.RequestBodies != null) + { + foreach (var requestBody in Components.RequestBodies.Where(b => !parameters.ContainsKey(b.Key))) + { + parameters.Add(requestBody.Key, requestBody.Value.ConvertToBodyParameter()); + } + } writer.WriteOptionalMap( OpenApiConstants.Parameters, - Components?.Parameters, + parameters, (w, key, component) => { if (component.Reference != null && diff --git a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs index 7983a243e..d047b9cb6 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiOperation.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiOperation.cs @@ -224,7 +224,7 @@ public void SerializeAsV2(IOpenApiWriter writer) // operationId writer.WriteProperty(OpenApiConstants.OperationId, OperationId); - IList parameters; + List parameters; if (Parameters == null) { parameters = new List(); @@ -237,70 +237,58 @@ public void SerializeAsV2(IOpenApiWriter writer) if (RequestBody != null) { // consumes - writer.WritePropertyName(OpenApiConstants.Consumes); - writer.WriteStartArray(); var consumes = RequestBody.Content.Keys.Distinct().ToList(); - foreach (var mediaType in consumes) + if (consumes.Any()) { - writer.WriteValue(mediaType); - } - - writer.WriteEndArray(); - - // This is form data. We need to split the request body into multiple parameters. - if (consumes.Contains("application/x-www-form-urlencoded") || - consumes.Contains("multipart/form-data")) - { - foreach (var property in RequestBody.Content.First().Value.Schema.Properties) + // This is form data. We need to split the request body into multiple parameters. + if (consumes.Contains("application/x-www-form-urlencoded") || + consumes.Contains("multipart/form-data")) { - var paramSchema = property.Value; - if ("string".Equals(paramSchema.Type, StringComparison.OrdinalIgnoreCase) - && ("binary".Equals(paramSchema.Format, StringComparison.OrdinalIgnoreCase) - || "base64".Equals(paramSchema.Format, StringComparison.OrdinalIgnoreCase))) - { - paramSchema.Type = "file"; - paramSchema.Format = null; - } - parameters.Add( - new OpenApiFormDataParameter - { - Description = property.Value.Description, - Name = property.Key, - Schema = property.Value, - Required = RequestBody.Content.First().Value.Schema.Required.Contains(property.Key) - - }); + parameters.AddRange(RequestBody.ConvertToFormDataParameters()); + } + else + { + parameters.Add(RequestBody.ConvertToBodyParameter()); } } - else + else if (RequestBody.Reference != null) { - var content = RequestBody.Content.Values.FirstOrDefault(); + parameters.Add( + new OpenApiParameter + { + UnresolvedReference = true, + Reference = RequestBody.Reference + }); - var bodyParameter = new OpenApiBodyParameter + if (RequestBody.Reference.HostDocument != null) { - Description = RequestBody.Description, - // V2 spec actually allows the body to have custom name. - // To allow round-tripping we use an extension to hold the name - Name = "body", - Schema = content?.Schema ?? new OpenApiSchema(), - Required = RequestBody.Required, - Extensions = RequestBody.Extensions.ToDictionary(k => k.Key, v => v.Value) // Clone extensions so we can remove the x-bodyName extensions from the output V2 model. - }; - - if (bodyParameter.Extensions.ContainsKey(OpenApiConstants.BodyName)) + var effectiveRequestBody = RequestBody.GetEffective(RequestBody.Reference.HostDocument); + if (effectiveRequestBody != null) + consumes = effectiveRequestBody.Content.Keys.Distinct().ToList(); + } + } + + if (consumes.Any()) + { + writer.WritePropertyName(OpenApiConstants.Consumes); + writer.WriteStartArray(); + foreach (var mediaType in consumes) { - bodyParameter.Name = (RequestBody.Extensions[OpenApiConstants.BodyName] as OpenApiString)?.Value ?? "body"; - bodyParameter.Extensions.Remove(OpenApiConstants.BodyName); + writer.WriteValue(mediaType); } - - parameters.Add(bodyParameter); + writer.WriteEndArray(); } } if (Responses != null) { - var produces = Responses.Where(r => r.Value.Content != null) - .SelectMany(r => r.Value.Content?.Keys) + var produces = Responses + .Where(static r => r.Value.Content != null) + .SelectMany(static r => r.Value.Content?.Keys) + .Concat( + Responses + .Where(static r => r.Value.Reference != null && r.Value.Reference.HostDocument != null) + .SelectMany(static r => r.Value.GetEffective(r.Value.Reference.HostDocument)?.Content?.Keys)) .Distinct() .ToList(); diff --git a/src/Microsoft.OpenApi/Models/OpenApiReference.cs b/src/Microsoft.OpenApi/Models/OpenApiReference.cs index 31cc5a6e8..ecc643dc3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiReference.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiReference.cs @@ -214,31 +214,17 @@ private string GetExternalReferenceV2() private string GetReferenceTypeNameAsV2(ReferenceType type) { - switch (type) + return type switch { - case ReferenceType.Schema: - return OpenApiConstants.Definitions; - - case ReferenceType.Parameter: - return OpenApiConstants.Parameters; - - case ReferenceType.Response: - return OpenApiConstants.Responses; - - case ReferenceType.Header: - return OpenApiConstants.Headers; - - case ReferenceType.Tag: - return OpenApiConstants.Tags; - - case ReferenceType.SecurityScheme: - return OpenApiConstants.SecurityDefinitions; - - default: - // If the reference type is not supported in V2, simply return null - // to indicate that the reference is not pointing to any object. - return null; - } + ReferenceType.Schema => OpenApiConstants.Definitions, + ReferenceType.Parameter or ReferenceType.RequestBody => OpenApiConstants.Parameters, + ReferenceType.Response => OpenApiConstants.Responses, + ReferenceType.Header => OpenApiConstants.Headers, + ReferenceType.Tag => OpenApiConstants.Tags, + ReferenceType.SecurityScheme => OpenApiConstants.SecurityDefinitions, + _ => null,// If the reference type is not supported in V2, simply return null + // to indicate that the reference is not pointing to any object. + }; } } } diff --git a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs index 9016fd7a3..70f1f742a 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiRequestBody.cs @@ -1,7 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; using System.Collections.Generic; +using System.Linq; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; @@ -144,5 +146,50 @@ public void SerializeAsV2WithoutReference(IOpenApiWriter writer) { // RequestBody object does not exist in V2. } + + internal OpenApiBodyParameter ConvertToBodyParameter() + { + var bodyParameter = new OpenApiBodyParameter + { + Description = Description, + // V2 spec actually allows the body to have custom name. + // To allow round-tripping we use an extension to hold the name + Name = "body", + Schema = Content.Values.FirstOrDefault()?.Schema ?? new OpenApiSchema(), + Required = Required, + Extensions = Extensions.ToDictionary(static k => k.Key, static v => v.Value) // Clone extensions so we can remove the x-bodyName extensions from the output V2 model. + }; + if (bodyParameter.Extensions.ContainsKey(OpenApiConstants.BodyName)) + { + bodyParameter.Name = (Extensions[OpenApiConstants.BodyName] as OpenApiString)?.Value ?? "body"; + bodyParameter.Extensions.Remove(OpenApiConstants.BodyName); + } + return bodyParameter; + } + + internal IEnumerable ConvertToFormDataParameters() + { + if (Content == null || !Content.Any()) + yield break; + + foreach (var property in Content.First().Value.Schema.Properties) + { + var paramSchema = property.Value; + if ("string".Equals(paramSchema.Type, StringComparison.OrdinalIgnoreCase) + && ("binary".Equals(paramSchema.Format, StringComparison.OrdinalIgnoreCase) + || "base64".Equals(paramSchema.Format, StringComparison.OrdinalIgnoreCase))) + { + paramSchema.Type = "file"; + paramSchema.Format = null; + } + yield return new OpenApiFormDataParameter + { + Description = property.Value.Description, + Name = property.Key, + Schema = property.Value, + Required = Content.First().Value.Schema.Required.Contains(property.Key) + }; + } + } } } diff --git a/src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs b/src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs index 840f9c660..feeceb9af 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs @@ -7,33 +7,36 @@ using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; -using Microsoft.OpenApi.Services; namespace Microsoft.OpenApi.Services { /// /// This class is used to walk an OpenApiDocument and convert unresolved references to references to populated objects /// - internal class OpenApiReferenceResolver : OpenApiVisitorBase + public class OpenApiReferenceResolver : OpenApiVisitorBase { private OpenApiDocument _currentDocument; - private bool _resolveRemoteReferences; + private readonly bool _resolveRemoteReferences; private List _errors = new List(); + /// + /// Initializes the class. + /// public OpenApiReferenceResolver(OpenApiDocument currentDocument, bool resolveRemoteReferences = true) { _currentDocument = currentDocument; _resolveRemoteReferences = resolveRemoteReferences; } - public IEnumerable Errors - { - get - { - return _errors; - } - } + /// + /// List of errors related to the OpenApiDocument + /// + public IEnumerable Errors => _errors; + /// + /// Resolves tags in OpenApiDocument + /// + /// public override void Visit(OpenApiDocument doc) { if (doc.Tags != null) @@ -42,6 +45,10 @@ public override void Visit(OpenApiDocument doc) } } + /// + /// Visits the referenceable element in the host document + /// + /// The referenceable element in the doc. public override void Visit(IOpenApiReferenceable referenceable) { if (referenceable.Reference != null) @@ -49,6 +56,11 @@ public override void Visit(IOpenApiReferenceable referenceable) referenceable.Reference.HostDocument = _currentDocument; } } + + /// + /// Resolves references in components + /// + /// public override void Visit(OpenApiComponents components) { ResolveMap(components.Parameters); @@ -62,6 +74,10 @@ public override void Visit(OpenApiComponents components) ResolveMap(components.Headers); } + /// + /// Resolves all references used in callbacks + /// + /// public override void Visit(IDictionary callbacks) { ResolveMap(callbacks); diff --git a/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj similarity index 90% rename from Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj rename to test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj index 084738bac..1a4002daa 100644 --- a/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj +++ b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj @@ -9,7 +9,7 @@ - + @@ -23,8 +23,8 @@ - - + + diff --git a/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs similarity index 100% rename from Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs rename to test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiFilterServiceTests.cs diff --git a/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs b/test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs similarity index 100% rename from Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs rename to test/Microsoft.OpenApi.Hidi.Tests/Services/OpenApiServiceTests.cs diff --git a/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/OpenApiDocumentMock.cs b/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/OpenApiDocumentMock.cs similarity index 100% rename from Microsoft.OpenApi.Hidi.Tests/UtilityFiles/OpenApiDocumentMock.cs rename to test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/OpenApiDocumentMock.cs diff --git a/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/Todo.xml b/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/Todo.xml similarity index 100% rename from Microsoft.OpenApi.Hidi.Tests/UtilityFiles/Todo.xml rename to test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/Todo.xml diff --git a/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver1.json b/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver1.json similarity index 100% rename from Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver1.json rename to test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver1.json diff --git a/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver2.json b/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver2.json similarity index 100% rename from Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver2.json rename to test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver2.json diff --git a/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver3.json b/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver3.json similarity index 100% rename from Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver3.json rename to test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver3.json diff --git a/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver4.json b/test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver4.json similarity index 100% rename from Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver4.json rename to test/Microsoft.OpenApi.Hidi.Tests/UtilityFiles/postmanCollection_ver4.json diff --git a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj index 63b7a2a1f..1579f85e5 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj +++ b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj @@ -250,7 +250,7 @@ - + diff --git a/test/Microsoft.OpenApi.SmokeTests/Microsoft.OpenApi.SmokeTests.csproj b/test/Microsoft.OpenApi.SmokeTests/Microsoft.OpenApi.SmokeTests.csproj index 114ba749c..7f41b101f 100644 --- a/test/Microsoft.OpenApi.SmokeTests/Microsoft.OpenApi.SmokeTests.csproj +++ b/test/Microsoft.OpenApi.SmokeTests/Microsoft.OpenApi.SmokeTests.csproj @@ -8,7 +8,7 @@ - + diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 5b476500c..b922d72d8 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -16,7 +16,7 @@ - + diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 15bc8562b..75e12f480 100755 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -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 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 callbacks) { } + public override void Visit(System.Collections.Generic.IDictionary examples) { } + public override void Visit(System.Collections.Generic.IDictionary headers) { } + public override void Visit(System.Collections.Generic.IDictionary links) { } + public override void Visit(System.Collections.Generic.IList parameters) { } + } public class OpenApiUrlTreeNode { public System.Collections.Generic.IDictionary> AdditionalData { get; set; }