/// <summary> /// 消息中是否有某个字段的类型不存在 /// </summary> /// <param name="messageStructure"></param> /// <param name="list"></param> /// <returns></returns> private static bool IsAnyFieldNotExistInMessageInternal(ProtocolControlCache_ProtoStructure.Message messageStructure, List <string> list = null) { if (messageStructure == null || messageStructure.Owner == null) { //消息不存在时返回false return(false); } if (list == null) { list = new List <string>(); } string msgTypeStr = messageStructure.Owner.Package + "." + messageStructure.MessageName; if (list.Contains(msgTypeStr)) { //已经检查过了,防止递归死循环 return(false); } list.Add(msgTypeStr); for (int i = 0; i < messageStructure.Variables.Length; i++) { var variableTemp = messageStructure.Variables[i]; if (!ServerTool_ProtocolControllerUtility.IsFieldExistInCSType(messageStructure.Owner.Package, messageStructure.MessageName, variableTemp.VariableName)) { //若字段在C#类中不存在,则返回true return(true); } if (variableTemp.VType == ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Others) { var variableType = ServerTool_ProtocolController_GenerateLuaFromProto.GetVariableTypeInOthers(messageStructure.Owner, messageStructure, variableTemp); if (variableType.isEnumType || variableType.messageType == null) { continue; } if (!ServerTool_ProtocolControllerUtility.IsCSTypeLoaded(variableType.typeString, out Type typeTemp)) { //若字段使用的类型未在C#中找到,则返回true return(true); } if (IsAnyFieldNotExistInMessageInternal(variableType.messageType, list)) { //若字段使用的类型中也有字段未在C#中实现,则也返回true return(true); } } } return(false); }
/// <summary> /// 在proto文件夹下批量将proto文件转为lua文件 /// </summary> /// <param name="fileNames">需要生成的文件列表</param> /// <param name="protoFolder">proto文件夹</param> /// <param name="decodeLuaFolder">转换脚本的lua文件夹</param> /// <param name="adjustFolderPath">调整脚本的lua文件夹</param> /// <returns>生成了lua文件的proto文件名</returns> private List <string> GenerateLuaFilesFromProto(List <string> fileNames, string protoFolder, string decodeLuaFolder, string adjustFolderPath) { List <string> list = new List <string>(); if (fileNames != null && !string.IsNullOrEmpty(protoFolder) && Directory.Exists(protoFolder) && !string.IsNullOrEmpty(decodeLuaFolder) && Directory.Exists(decodeLuaFolder)) { ServerTool_ProtocolController_GenerateLuaFromProto generateLuaFromProto = new ServerTool_ProtocolController_GenerateLuaFromProto(); for (int i = 0; i < fileNames.Count; i++) { if (generateLuaFromProto.DealProto(protoFolder + "/" + fileNames[i] + ".proto", decodeLuaFolder + "/" + fileNames[i] + ".lua", adjustFolderPath + "/" + fileNames[i] + "_adj.lua", true)) { list.Add(fileNames[i]); } } } return(list); }
/// <summary> /// 生成lua类的提示 /// </summary> /// <param name="proto"></param> /// <param name="msg"></param> /// <returns></returns> public static string GenerateLuaClassHint(ProtocolControlCache_ProtoStructure proto, ProtocolControlCache_ProtoStructure.Message msg) { if (msg == null) { return(string.Empty); } stringBuilderForLuaClassHint.Remove(0, stringBuilderForLuaClassHint.Length); stringBuilderForLuaClassHint.Append("---@class "); stringBuilderForLuaClassHint.Append(proto.Package); stringBuilderForLuaClassHint.Append("."); stringBuilderForLuaClassHint.Append(msg.MessageName); stringBuilderForLuaClassHint.Append("\r\n"); stringBuilderForLuaClassHint.Append("---class properties"); stringBuilderForLuaClassHint.Append("\r\n"); for (int i = 0; i < msg.Variables.Length; i++) { var variable = msg.Variables[i]; string typeStr = null; switch (variable.VType) { case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Bool: typeStr = "boolean"; break; case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Double: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Float: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Int32: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.UInt32: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Int64: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.UInt64: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.SInt32: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.SInt64: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Sing64: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Fixed32: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Fixed64: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.SFixed32: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.SFixed64: typeStr = "number"; break; case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.String: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Bytes: typeStr = "string"; break; case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Others: ServerTool_ProtocolController_GenerateLuaFromProto.VariableTypeInOthers variableTypeInOthers = ServerTool_ProtocolController_GenerateLuaFromProto.GetVariableTypeInOthers(proto, msg, variable); if (variableTypeInOthers.isEnumType && variableTypeInOthers.enumType != null) { typeStr = "number"; } else { typeStr = variableTypeInOthers.typeString; } break; default: break; } switch (variable.Modifier) { case ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Required: stringBuilderForLuaClassHint.Append("---@field public "); stringBuilderForLuaClassHint.Append(variable.VariableName); stringBuilderForLuaClassHint.Append(" "); stringBuilderForLuaClassHint.Append(typeStr); if (!string.IsNullOrEmpty(variable.DefaultValue)) { stringBuilderForLuaClassHint.Append(" [default = "); stringBuilderForLuaClassHint.Append(variable.DefaultValue); stringBuilderForLuaClassHint.Append("]"); } if (!string.IsNullOrEmpty(variable.Comment)) { stringBuilderForLuaClassHint.Append(" "); stringBuilderForLuaClassHint.Append(variable.Comment.Replace("\n", " ").Replace("\r", "")); } stringBuilderForLuaClassHint.Append("\r\n"); break; case ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Optional: stringBuilderForLuaClassHint.Append("---@field public "); stringBuilderForLuaClassHint.Append(variable.VariableName); stringBuilderForLuaClassHint.Append(" "); stringBuilderForLuaClassHint.Append(typeStr); if (!string.IsNullOrEmpty(variable.DefaultValue)) { stringBuilderForLuaClassHint.Append(" [default = "); stringBuilderForLuaClassHint.Append(variable.DefaultValue); stringBuilderForLuaClassHint.Append("]"); } if (!string.IsNullOrEmpty(variable.Comment)) { stringBuilderForLuaClassHint.Append(" "); stringBuilderForLuaClassHint.Append(variable.Comment.Replace("\n", " ").Replace("\r", "")); } stringBuilderForLuaClassHint.Append("\r\n"); stringBuilderForLuaClassHint.Append("---@field public "); stringBuilderForLuaClassHint.Append(variable.VariableName); stringBuilderForLuaClassHint.Append("Specified boolean"); stringBuilderForLuaClassHint.Append("\r\n"); break; case ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Repeated: stringBuilderForLuaClassHint.Append("---@field public "); stringBuilderForLuaClassHint.Append(variable.VariableName); stringBuilderForLuaClassHint.Append(" table<number, "); stringBuilderForLuaClassHint.Append(typeStr); stringBuilderForLuaClassHint.Append(">"); if (!string.IsNullOrEmpty(variable.Comment)) { stringBuilderForLuaClassHint.Append(" "); stringBuilderForLuaClassHint.Append(variable.Comment.Replace("\n", " ").Replace("\r", "")); } stringBuilderForLuaClassHint.Append("\r\n"); break; case ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.NULL: break; default: break; } } return(stringBuilderForLuaClassHint.ToString()); }