diff --git a/src/Microsoft.OpenApi.Hidi/StatsVisitor.cs b/src/Microsoft.OpenApi.Hidi/StatsVisitor.cs index b6af07778..d1f6f7f64 100644 --- a/src/Microsoft.OpenApi.Hidi/StatsVisitor.cs +++ b/src/Microsoft.OpenApi.Hidi/StatsVisitor.cs @@ -61,7 +61,7 @@ public override void Visit(OpenApiOperation operation) public int LinkCount { get; set; } - public override void Visit(OpenApiLink operation) + public override void Visit(OpenApiLink link) { LinkCount++; } diff --git a/src/Microsoft.OpenApi.Workbench/StatsVisitor.cs b/src/Microsoft.OpenApi.Workbench/StatsVisitor.cs index ed662d302..fafbc8188 100644 --- a/src/Microsoft.OpenApi.Workbench/StatsVisitor.cs +++ b/src/Microsoft.OpenApi.Workbench/StatsVisitor.cs @@ -61,7 +61,7 @@ public override void Visit(OpenApiOperation operation) public int LinkCount { get; set; } - public override void Visit(OpenApiLink operation) + public override void Visit(OpenApiLink link) { LinkCount++; } diff --git a/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs b/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs index be2e56a73..86fe7ea73 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiExtensibleDictionary.cs @@ -20,24 +20,23 @@ public abstract class OpenApiExtensibleDictionary : Dictionary, /// /// Parameterless constructor /// - protected OpenApiExtensibleDictionary() { } - + protected OpenApiExtensibleDictionary():this(null) { } /// /// Initializes a copy of class. /// /// The generic dictionary. /// The dictionary of . protected OpenApiExtensibleDictionary( - Dictionary dictionary = null, - IDictionary extensions = null) : base(dictionary) + Dictionary dictionary, + IDictionary extensions = null) : base(dictionary is null ? [] : dictionary) { - Extensions = extensions != null ? new Dictionary(extensions) : null; + Extensions = extensions != null ? new Dictionary(extensions) : []; } /// /// This object MAY be extended with Specification Extensions. /// - public IDictionary Extensions { get; set; } = new Dictionary(); + public IDictionary Extensions { get; set; } /// diff --git a/src/Microsoft.OpenApi/Services/OpenApiReferenceError.cs b/src/Microsoft.OpenApi/Services/OpenApiReferenceError.cs index d9a76368d..6dfd066ff 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiReferenceError.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiReferenceError.cs @@ -11,7 +11,10 @@ namespace Microsoft.OpenApi.Services /// public class OpenApiReferenceError : OpenApiError { - private OpenApiReference _reference; + /// + /// The reference that caused the error. + /// + public readonly OpenApiReference Reference; /// /// Initializes the class using the message and pointer from the given exception. /// @@ -26,7 +29,7 @@ public OpenApiReferenceError(OpenApiException exception) : base(exception.Pointe /// public OpenApiReferenceError(OpenApiReference reference, string message) : base("", message) { - _reference = reference; + Reference = reference; } } } diff --git a/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs b/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs index 6908e58bf..7281ef258 100644 --- a/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs +++ b/src/Microsoft.OpenApi/Validations/OpenApiValidator.cs @@ -67,219 +67,108 @@ public void AddWarning(OpenApiValidatorWarning warning) _warnings.Add(warning); } - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiDocument item) => Validate(item); + /// + public override void Visit(OpenApiDocument doc) => Validate(doc); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiInfo item) => Validate(item); + /// + public override void Visit(OpenApiInfo info) => Validate(info); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiContact item) => Validate(item); + /// + public override void Visit(OpenApiContact contact) => Validate(contact); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiComponents item) => Validate(item); + /// + public override void Visit(OpenApiComponents components) => Validate(components); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiHeader item) => Validate(item); + /// + public override void Visit(OpenApiHeader header) => Validate(header); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiResponse item) => Validate(item); + /// + public override void Visit(OpenApiResponse response) => Validate(response); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiMediaType item) => Validate(item); + /// + public override void Visit(OpenApiMediaType mediaType) => Validate(mediaType); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiResponses item) => Validate(item); + /// + public override void Visit(OpenApiResponses response) => Validate(response); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiExternalDocs item) => Validate(item); + /// + public override void Visit(OpenApiExternalDocs externalDocs) => Validate(externalDocs); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiLicense item) => Validate(item); + /// + public override void Visit(OpenApiLicense license) => Validate(license); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiOAuthFlow item) => Validate(item); + /// + public override void Visit(OpenApiOAuthFlow openApiOAuthFlow) => Validate(openApiOAuthFlow); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiTag item) => Validate(item); + /// + public override void Visit(OpenApiTag tag) => Validate(tag); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiParameter item) => Validate(item); + /// + public override void Visit(OpenApiParameter parameter) => Validate(parameter); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiSchema item) => Validate(item); + /// + public override void Visit(OpenApiSchema schema) => Validate(schema); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiServer item) => Validate(item); + /// + public override void Visit(OpenApiServer server) => Validate(server); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiEncoding item) => Validate(item); + /// + public override void Visit(OpenApiEncoding encoding) => Validate(encoding); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(OpenApiCallback item) => Validate(item); + /// + public override void Visit(OpenApiCallback callback) => Validate(callback); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(IOpenApiExtensible item) => Validate(item); + /// + public override void Visit(IOpenApiExtensible openApiExtensible) => Validate(openApiExtensible); - /// - /// Execute validation rules against an - /// - /// The object to be validated - public override void Visit(IOpenApiExtension item) => Validate(item, item.GetType()); + /// + public override void Visit(IOpenApiExtension openApiExtension) => Validate(openApiExtension, openApiExtension.GetType()); - /// - /// Execute validation rules against a list of - /// - /// The object to be validated - public override void Visit(IList items) => Validate(items, items.GetType()); + /// + public override void Visit(IList example) => Validate(example, example.GetType()); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(OpenApiPathItem item) => Validate(item); + /// + public override void Visit(OpenApiPathItem pathItem) => Validate(pathItem); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(OpenApiServerVariable item) => Validate(item); + /// + public override void Visit(OpenApiServerVariable serverVariable) => Validate(serverVariable); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(OpenApiSecurityScheme item) => Validate(item); + /// + public override void Visit(OpenApiSecurityScheme securityScheme) => Validate(securityScheme); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(OpenApiSecurityRequirement item) => Validate(item); + /// + public override void Visit(OpenApiSecurityRequirement securityRequirement) => Validate(securityRequirement); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(OpenApiRequestBody item) => Validate(item); + /// + public override void Visit(OpenApiRequestBody requestBody) => Validate(requestBody); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(OpenApiPaths item) => Validate(item); + /// + public override void Visit(OpenApiPaths paths) => Validate(paths); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(OpenApiLink item) => Validate(item); + /// + public override void Visit(OpenApiLink link) => Validate(link); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(OpenApiExample item) => Validate(item); + /// + public override void Visit(OpenApiExample example) => Validate(example); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(OpenApiOperation item) => Validate(item); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(IDictionary item) => Validate(item, item.GetType()); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(IDictionary item) => Validate(item, item.GetType()); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(IDictionary item) => Validate(item, item.GetType()); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(IDictionary item) => Validate(item, item.GetType()); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(IDictionary item) => Validate(item, item.GetType()); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(IDictionary item) => Validate(item, item.GetType()); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(IDictionary item) => Validate(item, item.GetType()); - /// - /// Execute validation rules against a - /// - /// The object to be validated - public override void Visit(IDictionary item) => Validate(item, item.GetType()); + /// + public override void Visit(OpenApiOperation operation) => Validate(operation); + /// + public override void Visit(IDictionary operations) => Validate(operations, operations.GetType()); + /// + public override void Visit(IDictionary headers) => Validate(headers, headers.GetType()); + /// + public override void Visit(IDictionary callbacks) => Validate(callbacks, callbacks.GetType()); + /// + public override void Visit(IDictionary content) => Validate(content, content.GetType()); + /// + public override void Visit(IDictionary examples) => Validate(examples, examples.GetType()); + /// + public override void Visit(IDictionary links) => Validate(links, links.GetType()); + /// + public override void Visit(IDictionary serverVariables) => Validate(serverVariables, serverVariables.GetType()); + /// + public override void Visit(IDictionary encodings) => Validate(encodings, encodings.GetType()); private void Validate(T item) { diff --git a/src/Microsoft.OpenApi/Validations/Rules/OpenApiComponentsRules.cs b/src/Microsoft.OpenApi/Validations/Rules/OpenApiComponentsRules.cs index 93eba5c71..bd14f93ed 100644 --- a/src/Microsoft.OpenApi/Validations/Rules/OpenApiComponentsRules.cs +++ b/src/Microsoft.OpenApi/Validations/Rules/OpenApiComponentsRules.cs @@ -17,7 +17,7 @@ public static class OpenApiComponentsRules /// /// The key regex. /// - public static Regex KeyRegex = new(@"^[a-zA-Z0-9\.\-_]+$"); + internal static readonly Regex KeyRegex = new(@"^[a-zA-Z0-9\.\-_]+$"); /// /// All the fixed fields declared above are objects diff --git a/src/Microsoft.OpenApi/Validations/Rules/OpenApiExtensionRules.cs b/src/Microsoft.OpenApi/Validations/Rules/OpenApiExtensionRules.cs index 890be82d7..3509d797f 100644 --- a/src/Microsoft.OpenApi/Validations/Rules/OpenApiExtensionRules.cs +++ b/src/Microsoft.OpenApi/Validations/Rules/OpenApiExtensionRules.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using System; +using System.Linq; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Properties; @@ -21,13 +22,10 @@ public static class OpenApiExtensibleRules (context, item) => { context.Enter("extensions"); - foreach (var extensible in item.Extensions) + foreach (var extensible in item.Extensions.Keys.Where(static x => !x.StartsWith("x-", StringComparison.OrdinalIgnoreCase))) { - if (!extensible.Key.StartsWith("x-")) - { - context.CreateError(nameof(ExtensionNameMustStartWithXDash), - String.Format(SRResource.Validation_ExtensionNameMustBeginWithXDash, extensible.Key, context.PathString)); - } + context.CreateError(nameof(ExtensionNameMustStartWithXDash), + string.Format(SRResource.Validation_ExtensionNameMustBeginWithXDash, extensible, context.PathString)); } context.Exit(); }); diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index c25a06688..83c6898c0 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -629,7 +629,7 @@ namespace Microsoft.OpenApi.Models where T : Microsoft.OpenApi.Interfaces.IOpenApiSerializable { protected OpenApiExtensibleDictionary() { } - protected OpenApiExtensibleDictionary(System.Collections.Generic.Dictionary dictionary = null, System.Collections.Generic.IDictionary extensions = null) { } + protected OpenApiExtensibleDictionary(System.Collections.Generic.Dictionary dictionary, System.Collections.Generic.IDictionary extensions = null) { } public System.Collections.Generic.IDictionary Extensions { get; set; } public void SerializeAsV2(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } public void SerializeAsV3(Microsoft.OpenApi.Writers.IOpenApiWriter writer) { } @@ -1452,6 +1452,7 @@ namespace Microsoft.OpenApi.Services } public class OpenApiReferenceError : Microsoft.OpenApi.Models.OpenApiError { + public readonly Microsoft.OpenApi.Models.OpenApiReference Reference; public OpenApiReferenceError(Microsoft.OpenApi.Exceptions.OpenApiException exception) { } public OpenApiReferenceError(Microsoft.OpenApi.Models.OpenApiReference reference, string message) { } } @@ -1577,43 +1578,43 @@ namespace Microsoft.OpenApi.Validations public System.Collections.Generic.IEnumerable Warnings { get; } public void AddError(Microsoft.OpenApi.Validations.OpenApiValidatorError error) { } public void AddWarning(Microsoft.OpenApi.Validations.OpenApiValidatorWarning warning) { } - public override void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtensible item) { } - public override void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtension item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiCallback item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiComponents item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiContact item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiDocument item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiEncoding item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiExample item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiExternalDocs item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiHeader item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiInfo item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiLicense item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiLink item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiMediaType item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiOAuthFlow item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiOperation item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiParameter item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiPathItem item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiPaths item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiRequestBody item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiResponse item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiResponses item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiSchema item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiSecurityRequirement item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiSecurityScheme item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiServer item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiServerVariable item) { } - public override void Visit(Microsoft.OpenApi.Models.OpenApiTag item) { } - public override void Visit(System.Collections.Generic.IDictionary item) { } - public override void Visit(System.Collections.Generic.IDictionary item) { } - public override void Visit(System.Collections.Generic.IDictionary item) { } - public override void Visit(System.Collections.Generic.IDictionary item) { } - public override void Visit(System.Collections.Generic.IDictionary item) { } - public override void Visit(System.Collections.Generic.IDictionary item) { } - public override void Visit(System.Collections.Generic.IDictionary item) { } - public override void Visit(System.Collections.Generic.IDictionary item) { } - public override void Visit(System.Collections.Generic.IList items) { } + public override void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtensible openApiExtensible) { } + public override void Visit(Microsoft.OpenApi.Interfaces.IOpenApiExtension openApiExtension) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiCallback callback) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiComponents components) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiContact contact) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiDocument doc) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiEncoding encoding) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiExample example) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiExternalDocs externalDocs) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiHeader header) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiInfo info) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiLicense license) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiLink link) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiMediaType mediaType) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiOAuthFlow openApiOAuthFlow) { } + 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.OpenApiPathItem pathItem) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiPaths paths) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiRequestBody requestBody) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiResponse response) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiResponses response) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiSchema schema) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiSecurityRequirement securityRequirement) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiSecurityScheme securityScheme) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiServer server) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiServerVariable serverVariable) { } + public override void Visit(Microsoft.OpenApi.Models.OpenApiTag tag) { } + public override void Visit(System.Collections.Generic.IDictionary operations) { } + public override void Visit(System.Collections.Generic.IDictionary callbacks) { } + public override void Visit(System.Collections.Generic.IDictionary encodings) { } + 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.IDictionary content) { } + public override void Visit(System.Collections.Generic.IDictionary serverVariables) { } + public override void Visit(System.Collections.Generic.IList example) { } } public class OpenApiValidatorError : Microsoft.OpenApi.Models.OpenApiError { @@ -1670,7 +1671,6 @@ namespace Microsoft.OpenApi.Validations.Rules [Microsoft.OpenApi.Validations.Rules.OpenApiRule] public static class OpenApiComponentsRules { - public static System.Text.RegularExpressions.Regex KeyRegex; public static Microsoft.OpenApi.Validations.ValidationRule KeyMustBeRegularExpression { get; } } [Microsoft.OpenApi.Validations.Rules.OpenApiRule]