From 6f7ecec2505911a48e939da2a1737d3a6a69bca2 Mon Sep 17 00:00:00 2001 From: Corniel Nobel Date: Wed, 23 Oct 2024 17:11:47 +0200 Subject: [PATCH] Use a hashset to prevent attributes from being added twice. --- .../Syntax/Attribute_decoration_specs.cs | 15 +++++++++++++++ .../Collections/Empty.cs | 3 +++ .../Extensions/Qowaiv.CodeGeneration.TypeInfo.cs | 7 +++++-- .../OpenApiTypeResolver.ResolveType.cs | 2 +- .../Qowaiv.CodeGeneration.OpenApi.csproj | 2 +- .../Qowaiv.CodeGeneration.csproj | 2 +- src/Qowaiv.CodeGeneration/Syntax/AttributeInfo.cs | 8 ++++++++ 7 files changed, 34 insertions(+), 5 deletions(-) diff --git a/specs/Qowaiv.CodeGeneration.Specs/Syntax/Attribute_decoration_specs.cs b/specs/Qowaiv.CodeGeneration.Specs/Syntax/Attribute_decoration_specs.cs index de72e9c..df84581 100644 --- a/specs/Qowaiv.CodeGeneration.Specs/Syntax/Attribute_decoration_specs.cs +++ b/specs/Qowaiv.CodeGeneration.Specs/Syntax/Attribute_decoration_specs.cs @@ -20,3 +20,18 @@ public void parameter_sets() null, KeyValuePair.Create("Author", (object?)"Qowaiv")) .Should().HaveContent("[NUnit.Framework.Test(Author = \"Qowaiv\")]\r\n"); } + +public class Equaly +{ + [Test] + public void by_value() + { + var attr = new AttributeInfo(typeof(TestAttribute), + null, KeyValuePair.Create("Author", (object?)"Qowaiv")); + + var ottr = new AttributeInfo(typeof(TestAttribute), + null, KeyValuePair.Create("Author", (object?)"Qowaiv")); + + attr.Equals(ottr).Should().BeTrue(); + } +} diff --git a/src/Qowaiv.CodeGeneration.OpenApi/Collections/Empty.cs b/src/Qowaiv.CodeGeneration.OpenApi/Collections/Empty.cs index 76cfb06..b0faa11 100644 --- a/src/Qowaiv.CodeGeneration.OpenApi/Collections/Empty.cs +++ b/src/Qowaiv.CodeGeneration.OpenApi/Collections/Empty.cs @@ -4,4 +4,7 @@ internal static class Empty { [Pure] public static List List() => []; + + [Pure] + public static HashSet HashSet() => []; } diff --git a/src/Qowaiv.CodeGeneration.OpenApi/Extensions/Qowaiv.CodeGeneration.TypeInfo.cs b/src/Qowaiv.CodeGeneration.OpenApi/Extensions/Qowaiv.CodeGeneration.TypeInfo.cs index aa47b84..b5a4734 100644 --- a/src/Qowaiv.CodeGeneration.OpenApi/Extensions/Qowaiv.CodeGeneration.TypeInfo.cs +++ b/src/Qowaiv.CodeGeneration.OpenApi/Extensions/Qowaiv.CodeGeneration.TypeInfo.cs @@ -7,8 +7,11 @@ internal static class TypeInfoExtensions { public static void AddAttributes(this TypeInfo info, IEnumerable attributes) { - var list = (List)info.Attributes; - list.AddRange(attributes); + var hashset = (HashSet)info.Attributes; + foreach (var attribute in attributes) + { + hashset.Add(attribute); + } } [Diagnostics.Contracts.CollectionMutation] diff --git a/src/Qowaiv.CodeGeneration.OpenApi/OpenApiTypeResolver.ResolveType.cs b/src/Qowaiv.CodeGeneration.OpenApi/OpenApiTypeResolver.ResolveType.cs index 25aeaa8..2a575c2 100644 --- a/src/Qowaiv.CodeGeneration.OpenApi/OpenApiTypeResolver.ResolveType.cs +++ b/src/Qowaiv.CodeGeneration.OpenApi/OpenApiTypeResolver.ResolveType.cs @@ -158,7 +158,7 @@ static bool IsNone(EnumerationField field) IsPartial = Settings.Partial, Properties = Empty.List(), DerivedTypes = Empty.List(), - Attributes = Empty.List(), + Attributes = Empty.HashSet(), Visibility = ResolveVisibility(schema), Documentation = new XmlDocumentation() { Summary = schema.Description }, }; diff --git a/src/Qowaiv.CodeGeneration.OpenApi/Qowaiv.CodeGeneration.OpenApi.csproj b/src/Qowaiv.CodeGeneration.OpenApi/Qowaiv.CodeGeneration.OpenApi.csproj index 58b420c..2bd870d 100644 --- a/src/Qowaiv.CodeGeneration.OpenApi/Qowaiv.CodeGeneration.OpenApi.csproj +++ b/src/Qowaiv.CodeGeneration.OpenApi/Qowaiv.CodeGeneration.OpenApi.csproj @@ -8,7 +8,7 @@ true - 0.0.1-alpha-021 + 0.0.1-alpha-022 Qowaiv.CodeGeneration.OpenApi true - 0.0.1-alpha-021 + 0.0.1-alpha-022 Qowaiv.CodeGeneration Represents an attribute decoration. @@ -114,4 +116,10 @@ public override int GetHashCode() return hash; } + + /// Returns true if both have the same values. + public static bool operator ==(AttributeInfo? l, AttributeInfo? r) => l is null ? r is null : l.Equals(r); + + /// Returns false if both have the same values. + public static bool operator !=(AttributeInfo? l, AttributeInfo? r) => !(l == r); }