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:29:07 UTC
[ignite] branch ignite-2.12 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 ignite-2.12
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/ignite-2.12 by this push:
new 5db7254 IGNITE-15845 .NET: Fix TypeNameParser to ignore escaped characters in compiler-generated type names (#9564)
5db7254 is described below
commit 5db72544629249cf285479e5df8018341a0d2c5b
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.
(cherry picked from commit d110e5f5b7eeb0e7591a21d69a31cee79c42a8df)
---
.../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 /> */