From b5cfd7ecb7b8e6c8ecda60982a59c1fc29960f13 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 12 Apr 2023 12:09:03 +0300 Subject: [PATCH 1/3] Store already cloned objects in a dictionary to avoid circular dependency during cloning --- .../Helpers/DictionaryCloneHelper.cs | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.OpenApi/Helpers/DictionaryCloneHelper.cs b/src/Microsoft.OpenApi/Helpers/DictionaryCloneHelper.cs index 279e4639d..a87765896 100644 --- a/src/Microsoft.OpenApi/Helpers/DictionaryCloneHelper.cs +++ b/src/Microsoft.OpenApi/Helpers/DictionaryCloneHelper.cs @@ -21,14 +21,26 @@ internal class DictionaryCloneHelper internal static Dictionary Clone(IDictionary dictionary) { if (dictionary is null) return null; + var clonedDictionary = new Dictionary(dictionary.Keys.Count); + var clonedObjects = new Dictionary(); - foreach (var kvp in dictionary) + foreach (var keyValuePair in dictionary) { - // Create instance of the specified type using the constructor matching the specified parameter types. - clonedDictionary[kvp.Key] = (U)Activator.CreateInstance(kvp.Value.GetType(), kvp.Value); - } - + // If the object has already been cloned, use the cloned object instead of cloning it again + if (clonedObjects.TryGetValue(keyValuePair.Value, out var clonedValue)) + { + clonedDictionary[keyValuePair.Key] = (U)clonedValue; + } + else + { + // Create instance of the specified type using the constructor matching the specified parameter types. + clonedDictionary[keyValuePair.Key] = (U)Activator.CreateInstance(keyValuePair.Value.GetType(), keyValuePair.Value); + + // Add the cloned object to the dictionary of cloned objects + clonedObjects.Add(keyValuePair.Value, clonedDictionary[keyValuePair.Key]); + } + } return clonedDictionary; } From e739083b7f975ef603eab17f7b36f2262d310803 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 12 Apr 2023 12:25:52 +0300 Subject: [PATCH 2/3] Adds a static class modifier --- src/Microsoft.OpenApi/Helpers/DictionaryCloneHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Helpers/DictionaryCloneHelper.cs b/src/Microsoft.OpenApi/Helpers/DictionaryCloneHelper.cs index a87765896..1af7bc8c4 100644 --- a/src/Microsoft.OpenApi/Helpers/DictionaryCloneHelper.cs +++ b/src/Microsoft.OpenApi/Helpers/DictionaryCloneHelper.cs @@ -9,7 +9,7 @@ namespace Microsoft.OpenApi.Helpers /// /// Helper class for deep cloning dictionaries. /// - internal class DictionaryCloneHelper + internal static class DictionaryCloneHelper { /// /// Deep clone key value pairs in a dictionary. From 178bb469ca3ea509142ac9c24d17bf3afc25a597 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 12 Apr 2023 15:40:30 +0300 Subject: [PATCH 3/3] Bump lib versions --- src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj | 2 +- src/Microsoft.OpenApi/Microsoft.OpenApi.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj b/src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj index 69597d978..b3c482215 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.6.4-preview2 + 1.6.4-preview3 OpenAPI.NET Readers for JSON and YAML documents © Microsoft Corporation. All rights reserved. OpenAPI .NET diff --git a/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj b/src/Microsoft.OpenApi/Microsoft.OpenApi.csproj index c996acbaf..4a291f120 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.6.4-preview2 + 1.6.4-preview3 .NET models with JSON and YAML writers for OpenAPI specification © Microsoft Corporation. All rights reserved. OpenAPI .NET