From aece732aee50d6ea06db87e2d1b026fbb6a1cb46 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Tue, 16 Jul 2024 19:43:02 +0200 Subject: [PATCH] fix: improve parsing of AssemblyQualifiedName (#233) Co-authored-by: biedermannn --- src/Silverback.Core/Util/TypesCache.cs | 35 +++++++++++++------ .../Util/TypesCacheTests.cs | 13 +++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Silverback.Core/Util/TypesCache.cs b/src/Silverback.Core/Util/TypesCache.cs index d4ca6f88b..c4955cee3 100644 --- a/src/Silverback.Core/Util/TypesCache.cs +++ b/src/Silverback.Core/Util/TypesCache.cs @@ -30,6 +30,31 @@ internal static class TypesCache return type; } + internal static string CleanAssemblyQualifiedName(string typeAssemblyQualifiedName) + { + if (string.IsNullOrEmpty(typeAssemblyQualifiedName)) + return typeAssemblyQualifiedName; + + int endGenericType = typeAssemblyQualifiedName.LastIndexOf(']'); + if (endGenericType == -1) + { + string[] split = typeAssemblyQualifiedName.Split(',', 3, StringSplitOptions.RemoveEmptyEntries); + return split.Length >= 2 ? $"{split[0].Trim()}, {split[1].Trim()}" : typeAssemblyQualifiedName; + } + + int startGenericType = typeAssemblyQualifiedName.IndexOf('[', StringComparison.InvariantCulture); + if (startGenericType == -1) + return typeAssemblyQualifiedName; + + string type = typeAssemblyQualifiedName[..startGenericType].Trim(); + if (endGenericType + 1 >= typeAssemblyQualifiedName.Length) + return type; + + string next = typeAssemblyQualifiedName[(endGenericType + 1)..]; + string assemblyName = next.Split(",", 2, StringSplitOptions.RemoveEmptyEntries)[0].Trim(); + return $"{type}, {assemblyName}"; + } + [SuppressMessage("", "CA1031", Justification = "Can catch all, the operation is retried")] private static Type? ResolveType(string typeName, bool throwOnError) { @@ -48,15 +73,5 @@ internal static class TypesCache return type; } - - private static string CleanAssemblyQualifiedName(string typeAssemblyQualifiedName) - { - if (string.IsNullOrEmpty(typeAssemblyQualifiedName)) - return typeAssemblyQualifiedName; - - var split = typeAssemblyQualifiedName.Split(','); - - return split.Length >= 2 ? $"{split[0]}, {split[1]}" : typeAssemblyQualifiedName; - } } } diff --git a/tests/Silverback.Core.Tests/Util/TypesCacheTests.cs b/tests/Silverback.Core.Tests/Util/TypesCacheTests.cs index 9999299b6..c0985ea69 100644 --- a/tests/Silverback.Core.Tests/Util/TypesCacheTests.cs +++ b/tests/Silverback.Core.Tests/Util/TypesCacheTests.cs @@ -62,5 +62,18 @@ public void GetType_IncompleteTypeName_TypeReturned() type.Should().Be(typeof(TestEventOne)); } + + [Theory] + [InlineData("Silverback.Tests.Core.TestTypes.Messages.TestEventOne2", "Silverback.Tests.Core.TestTypes.Messages.TestEventOne2")] + [InlineData("Silverback.Tests.Core.TestTypes.Messages.TestEventOne2, Silverback.Core.Tests", "Silverback.Tests.Core.TestTypes.Messages.TestEventOne2, Silverback.Core.Tests")] + [InlineData("Silverback.Tests.Core.TestTypes.Messages.TestEventOne2, Silverback.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Silverback.Tests.Core.TestTypes.Messages.TestEventOne2, Silverback.Core.Tests")] + [InlineData("Silverback.Tests.Core.Util.TypesCacheTests+MyMessage`2[[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int64, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Silverback.Core.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Silverback.Tests.Core.Util.TypesCacheTests+MyMessage`2, Silverback.Core.Tests")] + [InlineData("Silverback.Tests.Core.Util.TypesCacheTests+MyMessage`2[[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int64, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]", "Silverback.Tests.Core.Util.TypesCacheTests+MyMessage`2")] + public void GetType_GenericType_TypeReturned(string typeAssemblyQualifiedName, string expected) + { + string cleanedName = TypesCache.CleanAssemblyQualifiedName(typeAssemblyQualifiedName); + + cleanedName.Should().Be(expected); + } } }