From a033aa5962bf82a8cb5900f16273b2f3a46973e4 Mon Sep 17 00:00:00 2001 From: ada-l0velace <9060550+ada-l0velace@users.noreply.github.com> Date: Thu, 16 Jul 2026 03:12:10 +0100 Subject: [PATCH] GetTypeName: include generic type arguments --- Cpp2IL.Core.Tests/GenericTypeArgsTests.cs | 48 +++++++++++++++++++++++ Cpp2IL.Core/Utils/CsFileUtils.cs | 6 ++- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 Cpp2IL.Core.Tests/GenericTypeArgsTests.cs diff --git a/Cpp2IL.Core.Tests/GenericTypeArgsTests.cs b/Cpp2IL.Core.Tests/GenericTypeArgsTests.cs new file mode 100644 index 00000000..625913f5 --- /dev/null +++ b/Cpp2IL.Core.Tests/GenericTypeArgsTests.cs @@ -0,0 +1,48 @@ +using System.Linq; +using Cpp2IL.Core.Model.Contexts; +using Cpp2IL.Core.Utils; + +namespace Cpp2IL.Core.Tests; + + +public class GenericTypeArgsTests +{ + private ApplicationAnalysisContext _ctx = null!; + + [SetUp] + public void Setup() + { + Cpp2IlApi.ResetInternalState(); + _ctx = TestGameLoader.LoadSimple2022Game(); + } + + // Generic-instance types actually referenced in the fixture (field types — List, Dictionary, …). + private System.Collections.Generic.List GenericInstances() + => _ctx.Assemblies.SelectMany(a => a.Types) + .SelectMany(t => t.Fields.Select(f => f.FieldType)) + .OfType() + .ToList(); + + [Test] + public void Fixture_has_generic_instances() + { + Assert.That(GenericInstances(), Is.Not.Empty); + } + + [Test] + public void GetTypeName_appends_the_argument_list() + { + foreach (var gi in GenericInstances()) + { + var name = CsFileUtils.GetTypeName(gi); + + Assert.That(name, Does.Contain("<").And.Contain(">"), name); + Assert.That(name, Does.Not.Contain("`"), + $"CLR generic arity marker should not be rendered: {name}"); + + // the argument text is exactly each argument's own GetTypeName, comma-joined + var expectedArgs = string.Join(", ", gi.GenericArguments.Select(CsFileUtils.GetTypeName)); + Assert.That(name, Does.EndWith("<" + expectedArgs + ">"), name); + } + } +} diff --git a/Cpp2IL.Core/Utils/CsFileUtils.cs b/Cpp2IL.Core/Utils/CsFileUtils.cs index 907d584d..fd30592d 100644 --- a/Cpp2IL.Core/Utils/CsFileUtils.cs +++ b/Cpp2IL.Core/Utils/CsFileUtils.cs @@ -1,5 +1,6 @@ using System; using System.CodeDom.Compiler; +using System.Linq; using System.Reflection; using System.Text; using Cpp2IL.Core.Logging; @@ -368,7 +369,10 @@ public static string GetTypeName(TypeAnalysisContext type) { var genericTypeName = GetTypeName(genericInstanceType.GenericType); var backTickIndex = genericTypeName.LastIndexOf('`'); - return backTickIndex > 0 ? genericTypeName[..backTickIndex] : genericTypeName; + var baseName = backTickIndex > 0 ? genericTypeName[..backTickIndex] : genericTypeName; + return genericInstanceType.GenericArguments.Count > 0 + ? baseName + "<" + string.Join(", ", genericInstanceType.GenericArguments.Select(GetTypeName)) + ">" + : baseName; } if (type.Namespace is "System")