Skip to content

Commit 1eacadb

Browse files
authored
Special-case System.Enum as a generic constraint (#160)
1 parent 7a56995 commit 1eacadb

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

Il2CppInterop.Generator/Contexts/MethodRewriteContext.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,15 @@ public void CtorPhase2()
140140

141141
foreach (var oldConstraint in oldParameter.Constraints)
142142
{
143-
if (oldConstraint.Constraint?.FullName == "System.ValueType" ||
144-
oldConstraint.Constraint?.Resolve()?.IsInterface == true) continue;
143+
if (oldConstraint.IsSystemValueType() || oldConstraint.IsInterface())
144+
continue;
145+
146+
if (oldConstraint.IsSystemEnum())
147+
{
148+
newParameter.Constraints.Add(new GenericParameterConstraint(
149+
DeclaringType.AssemblyContext.Imports.Module.Enum().ToTypeDefOrRef()));
150+
continue;
151+
}
145152

146153
newParameter.Constraints.Add(new GenericParameterConstraint(
147154
DeclaringType.AssemblyContext.RewriteTypeRef(oldConstraint.Constraint?.ToTypeSignature()).ToTypeDefOrRef()));

Il2CppInterop.Generator/Extensions/AsmResolverExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ private static Parameter GetArgument(this ILProcessor instructions, int argument
5353

5454
public static bool IsNested(this TypeSignature type) => type.DeclaringType is not null;
5555

56+
public static bool IsSystemEnum(this GenericParameterConstraint constraint) => constraint.Constraint?.FullName is "System.Enum";
57+
58+
public static bool IsSystemValueType(this GenericParameterConstraint constraint) => constraint.Constraint?.FullName is "System.ValueType";
59+
60+
public static bool IsInterface(this GenericParameterConstraint constraint) => constraint.Constraint?.Resolve()?.IsInterface == true;
61+
5662
public static ITypeDefOrRef? AttributeType(this CustomAttribute attribute) => attribute.Constructor?.DeclaringType;
5763

5864
public static Parameter AddParameter(this MethodDefinition method, TypeSignature parameterSignature, string parameterName, ParameterAttributes parameterAttributes = default)

Il2CppInterop.Generator/Passes/Pass13FillGenericConstraints.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using AsmResolver.DotNet;
22
using Il2CppInterop.Generator.Contexts;
3+
using Il2CppInterop.Generator.Extensions;
4+
using Il2CppInterop.Generator.Utils;
35

46
namespace Il2CppInterop.Generator.Passes;
57

@@ -17,10 +19,16 @@ public static void DoPass(RewriteGlobalContext context)
1719
var newParameter = typeContext.NewType.GenericParameters[i];
1820
foreach (var originalConstraint in originalParameter.Constraints)
1921
{
20-
if (originalConstraint.Constraint?.FullName is "System.ValueType" ||
21-
originalConstraint.Constraint?.Resolve()?.IsInterface == true)
22+
if (originalConstraint.IsSystemValueType() || originalConstraint.IsInterface())
2223
continue;
2324

25+
if (originalConstraint.IsSystemEnum())
26+
{
27+
newParameter.Constraints.Add(new GenericParameterConstraint(
28+
typeContext.AssemblyContext.Imports.Module.Enum().ToTypeDefOrRef()));
29+
continue;
30+
}
31+
2432
newParameter.Constraints.Add(
2533
new GenericParameterConstraint(
2634
assemblyContext.RewriteTypeRef(originalConstraint.Constraint!)));

Il2CppInterop.Generator/Passes/Pass80UnstripMethods.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,14 @@ public static void DoPass(RewriteGlobalContext context)
7777
newParameter.Attributes = unityMethodGenericParameter.Attributes;
7878
foreach (var genericParameterConstraint in unityMethodGenericParameter.Constraints)
7979
{
80-
if (genericParameterConstraint.Constraint?.FullName == "System.ValueType") continue;
81-
if (genericParameterConstraint.Constraint?.Resolve()?.IsInterface ?? false) continue;
80+
if (genericParameterConstraint.IsSystemValueType() || genericParameterConstraint.IsInterface())
81+
continue;
82+
83+
if (genericParameterConstraint.IsSystemEnum())
84+
{
85+
newParameter.Constraints.Add(new GenericParameterConstraint(imports.Module.Enum().ToTypeDefOrRef()));
86+
continue;
87+
}
8288

8389
var newType = ResolveTypeInNewAssemblies(context, genericParameterConstraint.Constraint?.ToTypeSignature(),
8490
imports);

0 commit comments

Comments
 (0)