diff --git a/Cpp2IL.Core.Tests/TypeAnalysisContextTests.cs b/Cpp2IL.Core.Tests/TypeAnalysisContextTests.cs index e9d36ca6..97bcc6bb 100644 --- a/Cpp2IL.Core.Tests/TypeAnalysisContextTests.cs +++ b/Cpp2IL.Core.Tests/TypeAnalysisContextTests.cs @@ -1,3 +1,5 @@ +using Cpp2IL.Core.Model.Contexts; + namespace Cpp2IL.Core.Tests; public class TypeAnalysisContextTests @@ -49,4 +51,30 @@ public void StaticClassesHaveObjectBaseType() Assert.That(count, Is.GreaterThan(0)); } } + + [Test] + public void GenericInstanceTypeHasInstantiatedBaseType() + { + var appContext = TestGameLoader.LoadSimple2019Game(); + + // ObjectComparer inherits from Comparer + var objectComparerType = appContext.SystemTypes.SystemObjectType.DeclaringAssembly.GetTypeByFullName("System.Collections.Generic.ObjectComparer`1"); + + Assert.That(objectComparerType, Is.Not.Null); + Assert.That(objectComparerType.BaseType, Is.Not.Null); + using (Assert.EnterMultipleScope()) + { + Assert.That(objectComparerType.GenericParameters, Has.Count.EqualTo(1)); + Assert.That(objectComparerType.BaseType, Is.InstanceOf()); + } + Assert.That(((GenericInstanceTypeAnalysisContext)objectComparerType.BaseType).GenericArguments[0], Is.EqualTo(objectComparerType.GenericParameters[0])); + + var objectComparerStringType = objectComparerType.MakeGenericInstanceType(appContext.SystemTypes.SystemStringType); + Assert.That(objectComparerStringType.BaseType, Is.Not.Null); + Assert.That(objectComparerStringType.BaseType, Is.InstanceOf()); + + var baseType = (GenericInstanceTypeAnalysisContext)objectComparerStringType.BaseType; + Assert.That(baseType.GenericArguments, Has.Count.EqualTo(1)); + Assert.That(baseType.GenericArguments[0], Is.EqualTo(appContext.SystemTypes.SystemStringType)); + } } diff --git a/Cpp2IL.Core/Model/Contexts/GenericInstanceTypeAnalysisContext.cs b/Cpp2IL.Core/Model/Contexts/GenericInstanceTypeAnalysisContext.cs index 1cf646a0..85a4e6d5 100644 --- a/Cpp2IL.Core/Model/Contexts/GenericInstanceTypeAnalysisContext.cs +++ b/Cpp2IL.Core/Model/Contexts/GenericInstanceTypeAnalysisContext.cs @@ -50,7 +50,7 @@ public GenericInstanceTypeAnalysisContext(TypeAnalysisContext genericType, IEnum { GenericType = genericType; GenericArguments.AddRange(genericArguments); - DefaultBaseType = genericType.BaseType; + DefaultBaseType = genericType.BaseType is null ? null : GenericInstantiation.Instantiate(genericType.BaseType, [..genericArguments], []); SetDeclaringType(); }