using System.Collections.Generic; using Mono.CecilX; namespace Mirror.Weaver { public static class SyncObjectProcessor { /// /// Finds SyncObjects fields in a type /// Type should be a NetworkBehaviour /// /// /// public static List FindSyncObjectsFields(TypeDefinition td) { List syncObjects = new List(); foreach (FieldDefinition fd in td.Fields) { if (fd.FieldType.Resolve().ImplementsInterface()) { if (fd.IsStatic) { Weaver.Error($"{fd.Name} cannot be static", fd); continue; } GenerateReadersAndWriters(fd.FieldType); syncObjects.Add(fd); } } return syncObjects; } /// /// Generates serialization methods for synclists /// /// The synclist class /// the base SyncObject td inherits from static void GenerateReadersAndWriters(TypeReference tr) { if (tr is GenericInstanceType genericInstance) { foreach (TypeReference argument in genericInstance.GenericArguments) { if (!argument.IsGenericParameter) { Readers.GetReadFunc(argument); Writers.GetWriteFunc(argument); } } } if (tr != null) { GenerateReadersAndWriters(tr.Resolve().BaseType); } } } }