You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2021/11/16 08:27:59 UTC

[ignite] branch master updated: IGNITE-15845 .NET: Fix TypeNameParser to ignore escaped characters in compiler-generated type names (#9564)

This is an automated email from the ASF dual-hosted git repository.

ptupitsyn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new d110e5f  IGNITE-15845 .NET: Fix TypeNameParser to ignore escaped characters in compiler-generated type names (#9564)
d110e5f is described below

commit d110e5f5b7eeb0e7591a21d69a31cee79c42a8df
Author: Pavel Tupitsyn <pt...@apache.org>
AuthorDate: Tue Nov 16 11:27:44 2021 +0300

    IGNITE-15845 .NET: Fix TypeNameParser to ignore escaped characters in compiler-generated type names (#9564)
    
    Compiler-generated type names use `\` to escape characters such as `[` and `,`, example: `MassTransit.Initializers.PropertyConverters.MessageDataPropertyConverter+<MassTransit-Initializers-IPropertyConverter<MassTransit-MessageData<System-Byte\[\]>\,MassTransit-MessageData<System-String>>-Convert>d__4`.
    
    `TypeNameParser` was trying to parse those escaped characters as arrays, while it is just a part of the type name.
---
 .../Binary/TypeNameParserTest.cs                     | 20 +++++++++++++++++---
 .../Apache.Ignite.Core/Impl/Binary/TypeNameParser.cs | 14 +++++++++++++-
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeNameParserTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeNameParserTest.cs
index cf6d48b..b58b8d4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeNameParserTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/TypeNameParserTest.cs
@@ -87,7 +87,7 @@ namespace Apache.Ignite.Core.Tests.Binary
 #else
             const string coreAsmNamePrefix = "mscorlib,";
 #endif
-            
+
             // Simple name.
             var res = TypeNameParser.Parse("List`1[[Int]]");
             Assert.AreEqual("List`1", res.GetName());
@@ -193,9 +193,9 @@ namespace Apache.Ignite.Core.Tests.Binary
             Assert.AreEqual("System.Int32", gen.GetNameWithNamespace());
 
             res = TypeNameParser.Parse(typeof(NestedGeneric<int>.NestedGeneric2<string>).AssemblyQualifiedName);
-            
+
             Assert.AreEqual("NestedGeneric2`1", res.GetName());
-            Assert.AreEqual("Apache.Ignite.Core.Tests.Binary.TypeNameParserTest+NestedGeneric`1+NestedGeneric2`1", 
+            Assert.AreEqual("Apache.Ignite.Core.Tests.Binary.TypeNameParserTest+NestedGeneric`1+NestedGeneric2`1",
                 res.GetNameWithNamespace());
 
             Assert.AreEqual(2, res.Generics.Count);
@@ -239,6 +239,20 @@ namespace Apache.Ignite.Core.Tests.Binary
             CheckType(typeof(List<int>[][]));
         }
 
+        [Test]
+        public void TestCompilerGeneratedTypes()
+        {
+            var res = TypeNameParser.Parse(
+                @"Foo.Bar+<Abc-Def<System-String\,System-Byte\[\]>-Convert>d__0");
+
+            Assert.AreEqual(@"<Abc-Def<System-String\,System-Byte\[\]>-Convert>d__0", res.GetName());
+
+            var res2 = TypeNameParser.Parse(
+                @"Foo.Bar+<Foo-Bar<Abc-Def<System-Byte\[\]>\,Abc-Def<System-String>>-Convert>d__4`1");
+
+            Assert.AreEqual(@"<Foo-Bar<Abc-Def<System-Byte\[\]>\,Abc-Def<System-String>>-Convert>d__4`1", res2.GetName());
+        }
+
         /// <summary>
         /// Tests invalid type names.
         /// </summary>
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/TypeNameParser.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/TypeNameParser.cs
index 0042675..53ba61b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/TypeNameParser.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/TypeNameParser.cs
@@ -411,7 +411,19 @@ namespace Apache.Ignite.Core.Impl.Binary
         /// </summary>
         private char Char
         {
-            get { return _typeName[_pos]; }
+            get
+            {
+                const char escape = '\\';
+
+                if (_pos > 0 && _typeName[_pos - 1] == escape)
+                {
+                    // Ignore escaped characters in compiler-generated type names.
+                    // Return any non-separator character to continue parsing.
+                    return default;
+                }
+
+                return _typeName[_pos];
+            }
         }
 
         /** <inheritdoc /> */