Skip to content

Commit a3569e7

Browse files
authored
Add some additional methods for working with concrete generics (#485)
1 parent 0f26b32 commit a3569e7

File tree

4 files changed

+33
-1
lines changed

4 files changed

+33
-1
lines changed

Cpp2IL.Core/Model/Contexts/ConcreteGenericFieldAnalysisContext.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using System.Reflection;
23
using Cpp2IL.Core.Utils;
34

@@ -22,4 +23,9 @@ public ConcreteGenericFieldAnalysisContext(FieldAnalysisContext baseField, Gener
2223
BaseFieldContext = baseField;
2324
DefaultFieldType = GenericInstantiation.Instantiate(baseField.FieldType, genericInstanceType.GenericArguments, []);
2425
}
26+
27+
public ConcreteGenericFieldAnalysisContext(FieldAnalysisContext baseField, IEnumerable<TypeAnalysisContext> typeGenericParameters)
28+
: this(baseField, baseField.DeclaringType.MakeGenericInstanceType(typeGenericParameters))
29+
{
30+
}
2531
}

Cpp2IL.Core/Model/Contexts/FieldAnalysisContext.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System;
2+
using System.Collections.Generic;
13
using System.Reflection;
24
using Cpp2IL.Core.Utils;
35
using LibCpp2IL.BinaryStructures;
@@ -80,6 +82,18 @@ public FieldAnalysisContext(Il2CppFieldReflectionData? backingData, TypeAnalysis
8082
InitCustomAttributeData();
8183
}
8284

85+
public ConcreteGenericFieldAnalysisContext MakeConcreteGenericField(params IEnumerable<TypeAnalysisContext> typeGenericParameters)
86+
{
87+
if (this is ConcreteGenericFieldAnalysisContext)
88+
{
89+
throw new InvalidOperationException($"Attempted to make a {nameof(ConcreteGenericFieldAnalysisContext)} concrete: {this}");
90+
}
91+
else
92+
{
93+
return new ConcreteGenericFieldAnalysisContext(this, typeGenericParameters);
94+
}
95+
}
96+
8397
public override string ToString() => $"Field: {DeclaringType.Definition?.Name}::{BackingData?.Field.Name}";
8498

8599
#region StableNameDotNet

Cpp2IL.Core/Model/Contexts/MethodAnalysisContext.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,18 @@ public ConcreteGenericMethodAnalysisContext MakeGenericInstanceMethod(params IEn
310310
}
311311
}
312312

313+
public ConcreteGenericMethodAnalysisContext MakeConcreteGenericMethod(IEnumerable<TypeAnalysisContext> typeGenericParameters, IEnumerable<TypeAnalysisContext> methodGenericParameters)
314+
{
315+
if (this is ConcreteGenericMethodAnalysisContext)
316+
{
317+
throw new InvalidOperationException($"Attempted to make a {nameof(ConcreteGenericMethodAnalysisContext)} concrete: {this}");
318+
}
319+
else
320+
{
321+
return new ConcreteGenericMethodAnalysisContext(this, typeGenericParameters, methodGenericParameters);
322+
}
323+
}
324+
313325
public override string ToString() => $"Method: {FullName}";
314326

315327
#region StableNameDot implementation

Cpp2IL.Core/Model/Contexts/TypeAnalysisContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ public ByRefTypeAnalysisContext MakeByReferenceType()
242242
return new(this, DeclaringAssembly);
243243
}
244244

245-
public GenericInstanceTypeAnalysisContext MakeGenericInstanceType(IEnumerable<TypeAnalysisContext> genericArguments)
245+
public GenericInstanceTypeAnalysisContext MakeGenericInstanceType(params IEnumerable<TypeAnalysisContext> genericArguments)
246246
{
247247
return new(this, genericArguments, DeclaringAssembly);
248248
}

0 commit comments

Comments
 (0)