private static void GenerateReadersWriters(ModuleDefinition module, MethodReference method) { if (!method.IsGenericInstance) { return; } bool generate = method.Is(typeof(MessagePacker), nameof(MessagePacker.Pack)) || method.Is(typeof(MessagePacker), nameof(MessagePacker.GetId)) || method.Is(typeof(MessagePacker), nameof(MessagePacker.Unpack)) || method.Is <NetworkWriter>(nameof(NetworkWriter.Write)) || method.Is <NetworkReader>(nameof(NetworkReader.Read)) || method.Is <IMessageHandler>(nameof(IMessageHandler.Send)) || method.Is <IMessageHandler>(nameof(IMessageHandler.SendAsync)) || method.Is <IMessageHandler>(nameof(IMessageHandler.RegisterHandler)) || method.Is <IMessageHandler>(nameof(IMessageHandler.UnregisterHandler)) || method.Is <IMessageHandler>(nameof(IMessageHandler.Send)) || method.Is <NetworkConnection>(nameof(NetworkConnection.Send)) || method.Is <NetworkConnection>(nameof(NetworkConnection.SendAsync)) || method.Is <NetworkConnection>(nameof(NetworkConnection.RegisterHandler)) || method.Is <NetworkConnection>(nameof(NetworkConnection.UnregisterHandler)) || method.Is <INetworkClient>(nameof(INetworkClient.Send)) || method.Is <INetworkClient>(nameof(INetworkClient.SendAsync)) || method.Is <NetworkClient>(nameof(NetworkClient.Send)) || method.Is <NetworkClient>(nameof(NetworkClient.SendAsync)) || method.Is <NetworkServer>(nameof(NetworkServer.SendToAll)) || method.Is <NetworkServer>(nameof(NetworkServer.SendToClientOfPlayer)) || method.Is <NetworkServer>(nameof(NetworkServer.SendToReady)) || method.Is <INetworkServer>(nameof(INetworkServer.SendToAll)) || method.Is <INetworkServer>(nameof(INetworkServer.SendToReady)); if (generate) { var instanceMethod = (GenericInstanceMethod)method; TypeReference parameterType = instanceMethod.GenericArguments[0]; GenerateReadersWriters(module, parameterType); } }
private void GenerateReadersWriters(MethodReference method, SequencePoint sequencePoint) { if (!method.IsGenericInstance) { return; } bool isMessage = method.Is(typeof(MessagePacker), nameof(MessagePacker.Pack)) || method.Is(typeof(MessagePacker), nameof(MessagePacker.GetId)) || method.Is(typeof(MessagePacker), nameof(MessagePacker.Unpack)) || method.Is <IMessageHandler>(nameof(IMessageHandler.Send)) || method.Is <IMessageHandler>(nameof(IMessageHandler.SendAsync)) || method.Is <IMessageHandler>(nameof(IMessageHandler.RegisterHandler)) || method.Is <IMessageHandler>(nameof(IMessageHandler.UnregisterHandler)) || method.Is <IMessageHandler>(nameof(IMessageHandler.Send)) || method.Is <NetworkConnection>(nameof(NetworkConnection.Send)) || method.Is <NetworkConnection>(nameof(NetworkConnection.SendAsync)) || method.Is <NetworkConnection>(nameof(NetworkConnection.RegisterHandler)) || method.Is <NetworkConnection>(nameof(NetworkConnection.UnregisterHandler)) || method.Is <INetworkClient>(nameof(INetworkClient.Send)) || method.Is <INetworkClient>(nameof(INetworkClient.SendAsync)) || method.Is <NetworkClient>(nameof(NetworkClient.Send)) || method.Is <NetworkClient>(nameof(NetworkClient.SendAsync)) || method.Is <NetworkServer>(nameof(NetworkServer.SendToAll)) || method.Is <NetworkServer>(nameof(NetworkServer.SendToClientOfPlayer)) || method.Is <INetworkServer>(nameof(INetworkServer.SendToAll)); bool generate = isMessage || method.Is <NetworkWriter>(nameof(NetworkWriter.Write)) || method.Is <NetworkReader>(nameof(NetworkReader.Read)); if (generate) { var instanceMethod = (GenericInstanceMethod)method; TypeReference parameterType = instanceMethod.GenericArguments[0]; if (parameterType.IsGenericParameter) { return; } GenerateReadersWriters(parameterType, sequencePoint); if (isMessage) { messages.Add(parameterType); } } }
/// <summary> /// is method used to send a message? if it use then T is a message and needs read/write functions /// </summary> /// <param name="method"></param> /// <returns></returns> private static bool IsMessageMethod(MethodReference method) { return (method.Is(typeof(MessagePacker), nameof(MessagePacker.Pack)) || method.Is(typeof(MessagePacker), nameof(MessagePacker.GetId)) || method.Is(typeof(MessagePacker), nameof(MessagePacker.Unpack)) || method.Is <IMessageSender>(nameof(IMessageSender.Send)) || method.Is <IMessageReceiver>(nameof(IMessageReceiver.RegisterHandler)) || method.Is <IMessageReceiver>(nameof(IMessageReceiver.UnregisterHandler)) || method.Is <NetworkPlayer>(nameof(NetworkPlayer.Send)) || method.Is <MessageHandler>(nameof(MessageHandler.RegisterHandler)) || method.Is <MessageHandler>(nameof(MessageHandler.UnregisterHandler)) || method.Is <NetworkClient>(nameof(NetworkClient.Send)) || method.Is <NetworkServer>(nameof(NetworkServer.SendToAll)) || method.Is <NetworkServer>(nameof(NetworkServer.SendToMany)) || method.Is <INetworkServer>(nameof(INetworkServer.SendToAll))); }
private static bool IsReadWriteMethod(MethodReference method) { return (method.Is(typeof(GenericTypesSerializationExtensions), nameof(GenericTypesSerializationExtensions.Write)) || method.Is(typeof(GenericTypesSerializationExtensions), nameof(GenericTypesSerializationExtensions.Read))); }
private static bool IsReadWriteMethod(MethodReference method) { return (method.Is <NetworkWriter>(nameof(NetworkWriter.Write)) || method.Is <NetworkReader>(nameof(NetworkReader.Read))); }