Skip to content

Commit a6b70dc

Browse files
committed
Add some additional methods for working with concrete generics
1 parent d526068 commit a6b70dc

File tree

4 files changed

+25
-1
lines changed

4 files changed

+25
-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: 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
using LibCpp2IL.BinaryStructures;
@@ -80,6 +81,11 @@ public FieldAnalysisContext(Il2CppFieldReflectionData? backingData, TypeAnalysis
8081
InitCustomAttributeData();
8182
}
8283

84+
public ConcreteGenericFieldAnalysisContext MakeConcreteGenericField(params IEnumerable<TypeAnalysisContext> typeGenericParameters)
85+
{
86+
return new(this, typeGenericParameters);
87+
}
88+
8389
public override string ToString() => $"Field: {DeclaringType.Definition?.Name}::{BackingData?.Field.Name}";
8490

8591
#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("This is already concrete generic.");
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)