FindAllPublicFields_Improved: return field ref, specialize field

This commit is contained in:
JohnCorby 2022-03-04 02:12:57 -08:00
parent 156ff291e3
commit 230b26c937

View File

@ -1,4 +1,6 @@
using Mono.Cecil;
using Mirror.Weaver;
using Mono.Cecil;
using System;
using System.Collections.Generic;
namespace MirrorWeaver;
@ -9,8 +11,9 @@ public static class ImprovedExtensions
/// filters ONLY public fields instead of all non-private <br/>
/// replaces generic parameter fields with their corresponding argument
/// </summary>
public static IEnumerable<FieldDefinition> FindAllPublicFields_Improved(this TypeReference tr)
public static IEnumerable<FieldReference> FindAllPublicFields_Improved(this TypeReference tr)
{
Console.WriteLine($"FindAllPublicFields_Improved {tr}");
while (tr != null)
{
var td = tr.Resolve();
@ -26,15 +29,24 @@ public static class ImprovedExtensions
continue;
}
if (fd.FieldType is GenericParameter gp && gp.Owner == td)
FieldReference fr;
if (tr is GenericInstanceType git &&
fd.FieldType is GenericParameter gp &&
gp.Owner == td)
{
fd.FieldType = ((GenericInstanceType)tr).GenericArguments[gp.Position];
fr = fd.SpecializeField(fd.Module, git);
Console.WriteLine($"\t\t{fd.FieldType} -> {fr.FieldType}");
}
else
{
fr = fd.Module.ImportReference(fd);
}
yield return fd;
Console.WriteLine($"\t\t{fd}");
yield return fr;
}
tr = td.BaseType;
tr = td.BaseType?.ApplyGenericParameters(tr);
}
}
}
}