• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

SamboyCoding / Cpp2IL / 26005967564

17 May 2026 11:34PM UTC coverage: 35.273% (-0.06%) from 35.33%
26005967564

Pull #552

github

web-flow
Merge d03ec7dd9 into 6af99f218
Pull Request #552: Fix name overrides for constructed types

1974 of 6975 branches covered (28.3%)

Branch coverage included in aggregate %.

2 of 53 new or added lines in 12 files covered. (3.77%)

1 existing line in 1 file now uncovered.

4495 of 11365 relevant lines covered (39.55%)

252024.2 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

54.69
/Cpp2IL.Core/Model/Contexts/GenericInstanceTypeAnalysisContext.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Diagnostics;
4
using System.Linq;
5
using System.Reflection;
6
using System.Text;
7
using Cpp2IL.Core.Utils;
8
using LibCpp2IL.BinaryStructures;
9

10
namespace Cpp2IL.Core.Model.Contexts;
11

12
public class GenericInstanceTypeAnalysisContext : ReferencedTypeAnalysisContext
13
{
14
    public TypeAnalysisContext GenericType { get; }
946,768✔
15

16
    public List<TypeAnalysisContext> GenericArguments { get; } = [];
2,014,147✔
17

NEW
18
    public sealed override TypeAttributes DefaultAttributes => GenericType.DefaultAttributes;
×
19

NEW
20
    public sealed override TypeAttributes? OverrideAttributes { get => GenericType.OverrideAttributes; set => GenericType.OverrideAttributes = value; }
×
21

NEW
22
    public sealed override string DefaultName => $"{GenericType.DefaultName}<{string.Join(", ", GenericArguments.Select(a => a.DefaultFullName))}>";
×
23

24
    public sealed override string? OverrideName
25
    {
NEW
26
        get => $"{GenericType.Name}<{string.Join(", ", GenericArguments.Select(a => a.FullName))}>";
×
NEW
27
        set => throw new NotSupportedException();
×
28
    }
29

NEW
30
    public sealed override string DefaultNamespace => GenericType.DefaultNamespace;
×
31

32
    public sealed override string? OverrideNamespace
33
    {
NEW
34
        get => GenericType.OverrideNamespace;
×
NEW
35
        set => GenericType.OverrideNamespace = value;
×
36
    }
37

NEW
38
    public sealed override TypeAnalysisContext? DefaultBaseType { get; }
×
39

40
    public sealed override Il2CppTypeEnum Type => Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST;
×
41

42
    public sealed override bool IsGenericInstance => true;
×
43

44
    public sealed override bool IsValueType => GenericType.IsValueType; //We don't set a definition so the default implementation cannot determine if we're a value type or not. 
8,920✔
45

46
    private GenericInstanceTypeAnalysisContext(Il2CppType rawType, AssemblyAnalysisContext referencedFrom) : base(referencedFrom)
14,432✔
47
    {
48
        // Cache this instance before resolving anything else, which might contain a reference to this instance.
49
        // https://github.com/SamboyCoding/Cpp2IL/issues/469
50
        referencedFrom.GenericInstanceTypesByIl2CppType.TryAdd(rawType, this);
14,432✔
51

52
        //Generic type has to be a type definition
53
        var gClass = rawType.GetGenericClass();
14,432✔
54
        GenericType = AppContext.ResolveContextForType(gClass.TypeDefinition) ?? throw new($"Could not resolve type {gClass.TypeDefinition.FullName} for generic instance base type");
14,432!
55

56
        GenericArguments.AddRange(gClass.Context.ClassInst.Types.Select(referencedFrom.ResolveIl2CppType)!);
14,432✔
57

58
        SetDeclaringType();
14,432✔
59
    }
14,432✔
60

61
    public GenericInstanceTypeAnalysisContext(TypeAnalysisContext genericType, IEnumerable<TypeAnalysisContext> genericArguments, AssemblyAnalysisContext referencedFrom) : base(referencedFrom)
722,453✔
62
    {
63
        GenericType = genericType;
722,453✔
64
        GenericArguments.AddRange(genericArguments);
722,453✔
65
        DefaultBaseType = genericType.BaseType;
722,453✔
66

67
        SetDeclaringType();
722,453✔
68
    }
722,453✔
69

70
    /// <summary>
71
    /// Get or create a <see cref="GenericInstanceTypeAnalysisContext"/> from an <see cref="Il2CppType"/>.
72
    /// </summary>
73
    /// <param name="rawType">The underlying <see cref="Il2CppType"/>.</param>
74
    /// <param name="referencedFrom">The assembly that is referencing this generic instance.</param>
75
    /// <returns>The context for the <paramref name="rawType"/>.</returns>
76
    public static GenericInstanceTypeAnalysisContext GetOrCreate(Il2CppType rawType, AssemblyAnalysisContext referencedFrom)
77
    {
78
        if (rawType.Type != Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST)
177,609!
79
            throw new ArgumentException($"Cannot create {nameof(GenericInstanceTypeAnalysisContext)} from type {rawType.Type}. Expected {Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST}.");
×
80

81
        if (!referencedFrom.GenericInstanceTypesByIl2CppType.TryGetValue(rawType, out var result))
177,609✔
82
        {
83
            result = new GenericInstanceTypeAnalysisContext(rawType, referencedFrom);
14,432✔
84
            Debug.Assert(referencedFrom.GenericInstanceTypesByIl2CppType.ContainsKey(rawType), $"The {nameof(GenericInstanceTypeAnalysisContext)} constructor should add itself to the dictionary.");
85
        }
86

87
        return result;
177,609✔
88
    }
89

90
    public override string GetCSharpSourceString()
91
    {
92
        var sb = new StringBuilder();
×
93

94
        sb.Append(GenericType.GetCSharpSourceString());
×
95
        sb.Append('<');
×
96
        var first = true;
×
97
        foreach (var genericArgument in GenericArguments)
×
98
        {
99
            if (!first)
×
100
                sb.Append(", ");
×
101
            else
102
                first = false;
×
103

104
            sb.Append(genericArgument.GetCSharpSourceString());
×
105
        }
106

107
        sb.Append('>');
×
108

109
        return sb.ToString();
×
110
    }
111

112
    private void SetDeclaringType()
113
    {
114
        var declaringType = GenericType.DeclaringType;
736,885✔
115
        if (declaringType is null)
736,885✔
116
            return;
551,460✔
117

118
        DeclaringType = declaringType.GenericParameters.Count == 0
185,425✔
119
            ? declaringType
185,425✔
120
            : declaringType.MakeGenericInstanceType(GenericArguments.Take(declaringType.GenericParameters.Count));
185,425✔
121
    }
185,425✔
122
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc