Skip to content

Commit 8773356

Browse files
committed
Ensure the base type of generic instance types is instantiated
1 parent 6af99f2 commit 8773356

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

Cpp2IL.Core.Tests/TypeAnalysisContextTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using Cpp2IL.Core.Model.Contexts;
2+
13
namespace Cpp2IL.Core.Tests;
24

35
public class TypeAnalysisContextTests
@@ -49,4 +51,30 @@ public void StaticClassesHaveObjectBaseType()
4951
Assert.That(count, Is.GreaterThan(0));
5052
}
5153
}
54+
55+
[Test]
56+
public void GenericInstanceTypeHasInstantiatedBaseType()
57+
{
58+
var appContext = TestGameLoader.LoadSimple2019Game();
59+
60+
// ObjectComparer<T> inherits from Comparer<T>
61+
var objectComparerType = appContext.SystemTypes.SystemObjectType.DeclaringAssembly.GetTypeByFullName("System.Collections.Generic.ObjectComparer`1");
62+
63+
Assert.That(objectComparerType, Is.Not.Null);
64+
Assert.That(objectComparerType.BaseType, Is.Not.Null);
65+
using (Assert.EnterMultipleScope())
66+
{
67+
Assert.That(objectComparerType.GenericParameters, Has.Count.EqualTo(1));
68+
Assert.That(objectComparerType.BaseType, Is.InstanceOf<GenericInstanceTypeAnalysisContext>());
69+
}
70+
Assert.That(((GenericInstanceTypeAnalysisContext)objectComparerType.BaseType).GenericArguments[0], Is.EqualTo(objectComparerType.GenericParameters[0]));
71+
72+
var objectComparerStringType = objectComparerType.MakeGenericInstanceType(appContext.SystemTypes.SystemStringType);
73+
Assert.That(objectComparerStringType.BaseType, Is.Not.Null);
74+
Assert.That(objectComparerStringType.BaseType, Is.InstanceOf<GenericInstanceTypeAnalysisContext>());
75+
76+
var baseType = (GenericInstanceTypeAnalysisContext)objectComparerStringType.BaseType;
77+
Assert.That(baseType.GenericArguments, Has.Count.EqualTo(1));
78+
Assert.That(baseType.GenericArguments[0], Is.EqualTo(appContext.SystemTypes.SystemStringType));
79+
}
5280
}

Cpp2IL.Core/Model/Contexts/GenericInstanceTypeAnalysisContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public GenericInstanceTypeAnalysisContext(TypeAnalysisContext genericType, IEnum
5050
{
5151
GenericType = genericType;
5252
GenericArguments.AddRange(genericArguments);
53-
DefaultBaseType = genericType.BaseType;
53+
DefaultBaseType = genericType.BaseType is null ? null : GenericInstantiation.Instantiate(genericType.BaseType, [..genericArguments], []);
5454

5555
SetDeclaringType();
5656
}

0 commit comments

Comments
 (0)