/// <summary> /// 生成变量的字符串 /// </summary> /// <param name="msg">变量所在的消息</param> /// <param name="variable">变量</param> /// <returns></returns> private string GenerateAdjustVariable(ProtocolControlCache_ProtoStructure.Message msg, ProtocolControlCache_ProtoStructure.VariableInMessage variable) { if (msg == null || variable == null) { return(string.Empty); } stringBuilderForVariable.Remove(0, stringBuilderForVariable.Length); VariableTypeInOthers variableTypeInOthers = GetVariableTypeInOthers(proto, msg, variable); if (variable.VType == ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Others) { if (variable.Modifier == ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Optional) { stringBuilderForVariable.Append(GetCurrentRetract()); //optional类型 stringBuilderForVariable.Append("if tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" == nil then"); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("Specified = false"); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" = "); string defaultValue; if (variableTypeInOthers.isEnumType) { //为枚举类型 if (!string.IsNullOrEmpty(variable.DefaultValue)) { //默认值不为空时,选取枚举中对应的值 if (variableTypeInOthers.enumType != null && variableTypeInOthers.enumType.GetOption(variable.DefaultValue, out int index)) { defaultValue = index.ToString(); } else { defaultValue = "0"; } } else { defaultValue = "\"\""; } } else { //不为枚举类型 if (!string.IsNullOrEmpty(variable.DefaultValue)) { //若有默认值,则应该是字符串,则赋值字符串过去 defaultValue = "\"" + variable.DefaultValue + "\""; } else { //若没有默认值,则直接赋值nil defaultValue = "nil"; } } stringBuilderForVariable.Append(defaultValue); MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("else"); AddRetract(); if (variable.VType == ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Others && !variableTypeInOthers.isEnumType && !string.IsNullOrEmpty(variableTypeInOthers.adjustNullAdjustString)) { stringBuilderForVariable.Append(GetCurrentRetract()); //variableTypeInOthers.adjustHelpString stringBuilderForVariable.Append("if tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("Specified == nil "); stringBuilderForVariable.Append("then "); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("Specified = true"); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("if "); stringBuilderForVariable.Append(variableTypeInOthers.adjustNullAdjustString); stringBuilderForVariable.Append(" then"); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append(variableTypeInOthers.adjustHelpString); stringBuilderForVariable.Append("(tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(")"); MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("end"); MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("end"); } else { stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("Specified = true"); } MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("end"); } else if (variable.Modifier == ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Repeated) { stringBuilderForVariable.Append(GetCurrentRetract()); //repeated类型 stringBuilderForVariable.Append("if tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" == nil then"); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" = {}"); MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("else"); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("if "); stringBuilderForVariable.Append(variableTypeInOthers.adjustNullAdjustString); stringBuilderForVariable.Append(" then"); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("for i = 1, #tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" do"); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append(variableTypeInOthers.adjustHelpString); stringBuilderForVariable.Append("(tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("[i])"); MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); MinusRetract(); stringBuilderForVariable.Append("end"); stringBuilderForVariable.Append(GetCurrentRetract()); MinusRetract(); stringBuilderForVariable.Append("end"); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("end"); } } else { if (variable.Modifier == ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Optional) { stringBuilderForVariable.Append(GetCurrentRetract()); //普通类型仅对optional类型字段进行Specified判定 stringBuilderForVariable.Append("if tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" == nil then"); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("Specified = false"); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" = "); string defaultValue; switch (variable.VType) { case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Bool: if (!string.IsNullOrEmpty(variable.DefaultValue) && variable.DefaultValue.ToLower() == "true") { defaultValue = "true"; } else { defaultValue = "false"; } 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: if (!string.IsNullOrEmpty(variable.DefaultValue) && double.TryParse(variable.DefaultValue, out double valueTemp)) { defaultValue = valueTemp.ToString(); } else { defaultValue = "0"; } break; case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.String: case ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Bytes: default: //字符串类型 if (!string.IsNullOrEmpty(variable.DefaultValue)) { defaultValue = "\"" + variable.DefaultValue + "\""; } else { defaultValue = "\"\""; } break; } stringBuilderForVariable.Append(defaultValue); MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("else"); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("tbl."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("Specified = true"); MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("end"); } } return(stringBuilderForVariable.ToString()); }
/// <summary> /// 获得变量类型为Others的变量的实际类型 /// </summary> /// <param name="proto">消息所属的proto</param> /// <param name="msg">变量所在消息</param> /// <param name="variable">需要获取类型的变量</param> /// <returns>其他类型变量的类型</returns> public static VariableTypeInOthers GetVariableTypeInOthers(ProtocolControlCache_ProtoStructure proto, ProtocolControlCache_ProtoStructure.Message msg, ProtocolControlCache_ProtoStructure.VariableInMessage variable) { VariableTypeInOthers variableTypeInOthers = new VariableTypeInOthers(); //Others一般只有枚举和消息两种类型,多层次遍历查询 //得到去掉包名或者消息名的变量类型名 string[] strs = variable.VariableTypeString.Split('.'); string pureVariableTypeString; if (strs != null && strs.Length > 1) { pureVariableTypeString = strs[strs.Length - 1]; } else { pureVariableTypeString = variable.VariableTypeString; } //先遍历本消息内定义的枚举 for (int i = 0; i < msg.Enums.Length; i++) { if (pureVariableTypeString == msg.Enums[i].EnumName) { variableTypeInOthers.isEnumType = true; variableTypeInOthers.isInOtherPackage = false; variableTypeInOthers.decodeHelpString = string.Format("CS.{0}.{1}.{2}.__CastFrom", proto.Package, msg.MessageName, msg.Enums[i].EnumName); variableTypeInOthers.typeString = string.Format("{0}.{1}.{2}", proto.Package, msg.MessageName, msg.Enums[i].EnumName); variableTypeInOthers.adjustHelpString = string.Empty; variableTypeInOthers.adjustNullAdjustString = string.Empty; variableTypeInOthers.enumType = msg.Enums[i]; variableTypeInOthers.messageType = null; return(variableTypeInOthers); } } //再遍历本proto中定义的枚举 for (int i = 0; i < proto.EnumsInProto.Count; i++) { if (pureVariableTypeString == proto.EnumsInProto[i].EnumName) { variableTypeInOthers.isEnumType = true; variableTypeInOthers.isInOtherPackage = false; variableTypeInOthers.decodeHelpString = string.Format("CS.{0}.{1}.__CastFrom", proto.Package, proto.EnumsInProto[i].EnumName); variableTypeInOthers.typeString = string.Format("{0}.{1}", proto.Package, proto.EnumsInProto[i].EnumName); variableTypeInOthers.adjustNullAdjustString = string.Empty; variableTypeInOthers.adjustHelpString = string.Empty; variableTypeInOthers.enumType = proto.EnumsInProto[i]; variableTypeInOthers.messageType = null; return(variableTypeInOthers); } } //而后遍历proto中定义的消息 for (int i = 0; i < proto.Messages.Count; i++) { if (pureVariableTypeString == proto.Messages[i].MessageName) { variableTypeInOthers.isEnumType = false; variableTypeInOthers.isInOtherPackage = false; variableTypeInOthers.decodeHelpString = string.Format("{0}.{1}", proto.Package, proto.Messages[i].MessageName); variableTypeInOthers.typeString = string.Format("{0}.{1}", proto.Package, proto.Messages[i].MessageName); variableTypeInOthers.adjustHelpString = string.Format("{0}_adj.Adjust{1}", proto.Package, proto.Messages[i].MessageName); variableTypeInOthers.adjustNullAdjustString = string.Format("{0}_adj.Adjust{1} ~= nil", proto.Package, proto.Messages[i].MessageName); variableTypeInOthers.enumType = null; variableTypeInOthers.messageType = proto.Messages[i]; return(variableTypeInOthers); } } //最后遍历其他proto for (int i = 0; i < proto.ImportedProtos.Count; i++) { //枚举 for (int j = 0; j < proto.ImportedProtos[i].EnumsInProto.Count; j++) { if (pureVariableTypeString == proto.ImportedProtos[i].EnumsInProto[j].EnumName) { variableTypeInOthers.isEnumType = true; variableTypeInOthers.isInOtherPackage = true; variableTypeInOthers.decodeHelpString = string.Format("CS.{0}.{1}.__CastFrom", proto.ImportedProtos[i].Package, proto.ImportedProtos[i].EnumsInProto[j].EnumName); variableTypeInOthers.typeString = string.Format("{0}.{1}", proto.ImportedProtos[i].Package, proto.ImportedProtos[i].EnumsInProto[j].EnumName); variableTypeInOthers.adjustHelpString = string.Empty; variableTypeInOthers.adjustNullAdjustString = string.Empty; variableTypeInOthers.enumType = proto.ImportedProtos[i].EnumsInProto[j]; variableTypeInOthers.messageType = null; return(variableTypeInOthers); } } //消息 for (int j = 0; j < proto.ImportedProtos[i].Messages.Count; j++) { if (pureVariableTypeString == proto.ImportedProtos[i].Messages[j].MessageName) { variableTypeInOthers.isEnumType = false; variableTypeInOthers.isInOtherPackage = true; variableTypeInOthers.decodeHelpString = string.Format("decodeTable.{0}.{1}", proto.ImportedProtos[i].ProtoFileName, proto.ImportedProtos[i].Messages[j].MessageName); variableTypeInOthers.typeString = string.Format("{0}.{1}", proto.ImportedProtos[i].Package, proto.ImportedProtos[i].Messages[j].MessageName); variableTypeInOthers.adjustHelpString = string.Format("adjustTable.{0}_adj.Adjust{1}", proto.ImportedProtos[i].ProtoFileName, proto.ImportedProtos[i].Messages[j].MessageName); variableTypeInOthers.adjustNullAdjustString = string.Format("adjustTable.{0}_adj ~= nil and adjustTable.{0}_adj.Adjust{1} ~= nil", proto.ImportedProtos[i].ProtoFileName, proto.ImportedProtos[i].Messages[j].MessageName); variableTypeInOthers.enumType = null; variableTypeInOthers.messageType = proto.ImportedProtos[i].Messages[j]; return(variableTypeInOthers); } } } //若还未找到,则返回原始的变量类型 variableTypeInOthers.isEnumType = false; variableTypeInOthers.isInOtherPackage = false; variableTypeInOthers.decodeHelpString = variable.VariableTypeString; variableTypeInOthers.typeString = variable.VariableTypeString; variableTypeInOthers.adjustHelpString = variable.VariableTypeString; variableTypeInOthers.adjustNullAdjustString = variable.VariableTypeString; variableTypeInOthers.enumType = null; variableTypeInOthers.messageType = null; if (variable.VType == ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Others) { UnityEngine.Debug.LogErrorFormat("未在proto文件或其他proto文件中找到 {0}.{1} 的 {2} 字段类型", proto.Package, msg.MessageName, variable.VariableTypeString); } return(variableTypeInOthers); }
/// <summary> /// 生成变量的字符串 /// </summary> /// <param name="msg">变量所在的消息</param> /// <param name="variable">变量</param> /// <returns></returns> private string GenerateDecodeVariable(ProtocolControlCache_ProtoStructure.Message msg, ProtocolControlCache_ProtoStructure.VariableInMessage variable) { if (msg == null || variable == null) { return(string.Empty); } stringBuilderForVariable.Remove(0, stringBuilderForVariable.Length); //optional和repeated类型变量需要先判空 if (variable.Modifier == ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Optional || variable.Modifier == ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Repeated) { stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("if decodedData."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" ~= nil and decodedData."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("Specified ~= false then"); AddRetract(); } //require和optional类型变量 if (variable.Modifier == ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Required || variable.Modifier == ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Optional) { stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("data."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" = "); if (variable.VType == ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Others) { VariableTypeInOthers variableTypeInOthers = GetVariableTypeInOthers(proto, msg, variable); stringBuilderForVariable.Append(variableTypeInOthers.decodeHelpString); stringBuilderForVariable.Append("(decodedData."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(")"); } else { stringBuilderForVariable.Append("decodedData."); stringBuilderForVariable.Append(variable.VariableName); } } //repeated类型变量 else { stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("for i = 1, #decodedData."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(" do"); AddRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("data."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append(":Add("); if (variable.VType == ProtocolControlCache_ProtoStructure.VariableInMessage.VariableType.Others) { VariableTypeInOthers variableTypeInOthers = GetVariableTypeInOthers(proto, msg, variable); stringBuilderForVariable.Append(variableTypeInOthers.decodeHelpString); stringBuilderForVariable.Append("(decodedData."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("[i])"); } else { stringBuilderForVariable.Append("decodedData."); stringBuilderForVariable.Append(variable.VariableName); stringBuilderForVariable.Append("[i]"); } stringBuilderForVariable.Append(")"); MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("end"); } //optional和repeated类型变量需要结束判空 if (variable.Modifier == ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Optional || variable.Modifier == ProtocolControlCache_ProtoStructure.VariableInMessage.ModifierType.Repeated) { MinusRetract(); stringBuilderForVariable.Append(GetCurrentRetract()); stringBuilderForVariable.Append("end"); } return(stringBuilderForVariable.ToString()); }