SyncObjectProcessor.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System.Collections.Generic;
  2. using Mono.CecilX;
  3. namespace Mirror.Weaver
  4. {
  5. public static class SyncObjectProcessor
  6. {
  7. /// <summary>
  8. /// Finds SyncObjects fields in a type
  9. /// <para>Type should be a NetworkBehaviour</para>
  10. /// </summary>
  11. /// <param name="td"></param>
  12. /// <returns></returns>
  13. public static List<FieldDefinition> FindSyncObjectsFields(TypeDefinition td)
  14. {
  15. List<FieldDefinition> syncObjects = new List<FieldDefinition>();
  16. foreach (FieldDefinition fd in td.Fields)
  17. {
  18. if (fd.FieldType.Resolve().ImplementsInterface<SyncObject>())
  19. {
  20. if (fd.IsStatic)
  21. {
  22. Weaver.Error($"{fd.Name} cannot be static", fd);
  23. continue;
  24. }
  25. GenerateReadersAndWriters(fd.FieldType);
  26. syncObjects.Add(fd);
  27. }
  28. }
  29. return syncObjects;
  30. }
  31. /// <summary>
  32. /// Generates serialization methods for synclists
  33. /// </summary>
  34. /// <param name="td">The synclist class</param>
  35. /// <param name="mirrorBaseType">the base SyncObject td inherits from</param>
  36. static void GenerateReadersAndWriters(TypeReference tr)
  37. {
  38. if (tr is GenericInstanceType genericInstance)
  39. {
  40. foreach (TypeReference argument in genericInstance.GenericArguments)
  41. {
  42. if (!argument.IsGenericParameter)
  43. {
  44. Readers.GetReadFunc(argument);
  45. Writers.GetWriteFunc(argument);
  46. }
  47. }
  48. }
  49. if (tr != null)
  50. {
  51. GenerateReadersAndWriters(tr.Resolve().BaseType);
  52. }
  53. }
  54. }
  55. }