static void InitField(StringBuilder initer, FieldWrap field) { int level = SEM_LEVEL + 1; if (field.IsRaw || field.IsEnum || field.IsClass) { initer.Space(SEM_LEVEL); initer.AppendLine($"{field.Name} = {ReadValue(field)};"); } else if (field.OriginalType == Setting.LIST) { initer.Space(SEM_LEVEL).AppendLine($"for (int n = {ARG_DATASTREAM}.GetArrayLength(); n-- > 0;)"); initer.Space(SEM_LEVEL).AppendLine("{"); { FieldWrap item = field.GetItemDefine(); initer.Space(level).AppendLine($"var v = {ReadValue(item)};"); initer.Space(level).AppendLine($"{field.Name}.Add(v);"); } initer.Space(SEM_LEVEL).AppendLine("}"); } else if (field.OriginalType == Setting.DICT) { initer.Space(SEM_LEVEL).AppendLine($"for (int n = {ARG_DATASTREAM}.GetMapLength(); n-- > 0;)"); initer.Space(SEM_LEVEL).AppendLine("{"); { FieldWrap key = field.GetKeyDefine(); FieldWrap value = field.GetValueDefine(); initer.Space(level).AppendLine($"var k = {ReadValue(key)};"); initer.Space(level).AppendLine($"{field.Name}[k] = {ReadValue(value)};"); } initer.Space(SEM_LEVEL).AppendLine("}"); } }
static void ReadFunc(StringBuilder reader, FieldWrap field) { int level = SEM_LEVEL + 1; string type = Util.CorrectFullType(field.FullName); if (field.IsRaw) { reader.Space(level).AppendLine($"case \"{field.Name}\": {field.Name} = Read{type.FirstCharUpper()}(_2); break;"); } else if (field.IsEnum) { reader.Space(level).AppendLine($"case \"{field.Name}\": {field.Name} = ({type})ReadInt(_2); break;"); } else if (field.IsClass) { if (field.IsDynamic) { string ns = type.Substring(0, type.LastIndexOf('.')); reader.Space(level).AppendLine($"case \"{field.Name}\": {field.Name} = ReadDynamicObject<{type}>(_2, \"{ns}\"); break;"); } else { reader.Space(level).AppendLine($"case \"{field.Name}\": {field.Name} = ReadObject<{type}>(_2, \"{type}\"); break;"); } } else if (field.IsContainer) { var level0 = level + 1; reader.Space(level).AppendLine($"case \"{field.Name}\":"); if (field.OriginalType == Setting.LIST) { var item = field.GetItemDefine(); reader.Space(level0).AppendLine($"var {field.Name}s = GetChilds(_2);"); reader.Space(level0).AppendLine($"for (int i = 0; i < {field.Name}s.Count; i++)"); reader.Space(level0).AppendLine($"{{"); reader.Space(level0 + 1).AppendLine($"var _3 = {field.Name}s[i];"); reader.Space(level0 + 1).AppendLine($"{field.Name}.Add({ReadList(item)});"); reader.Space(level0).AppendLine($"}}"); reader.Space(level0).AppendLine($"break;"); } else if (field.OriginalType == Setting.DICT) { var key = field.GetKeyDefine(); var value = field.GetValueDefine(); reader.Space(level0).AppendLine($"var {field.Name}s = GetChilds(_2);"); reader.Space(level0).AppendLine($"for (int i = 0; i < {field.Name}s.Count; i++)"); reader.Space(level0).AppendLine($"{{"); reader.Space(level0 + 1).AppendLine($"var _3 = {field.Name}s[i];"); reader.Space(level0 + 1).AppendLine($"var key = {ReadDict(key, Setting.KEY)};"); reader.Space(level0 + 1).AppendLine($"var value = {ReadDict(value, Setting.VALUE)};"); reader.Space(level0 + 1).AppendLine($"{field.Name}.Add(key, value);"); reader.Space(level0).AppendLine($"}}"); reader.Space(level0).AppendLine($"break;"); } } }
public override void GetList(FList data, FieldWrap define) { FieldWrap item = define.GetItemDefine(); while (!IsSectionEnd()) { var d = Data.Create(data.Host, item, this); if (data.IsRoot)//数据表List { Program.AddLastData(d); } data.Values.Add(d); } }
/// <summary> /// 数据结构定义 /// </summary> private static void GenDataStruct() { StringBuilder builder = new StringBuilder(); builder.AppendLine("local Stream = require(\"Common.DataStream\")"); builder.AppendLine("local GetOrCreate = Util.GetOrCreate"); builder.AppendLine(); builder.AppendLine("local meta"); var cit = ClassWrap.Classes.GetEnumerator(); while (cit.MoveNext()) { var cls = cit.Current.Value; var fullType = Util.CorrectFullType(cls.FullName); builder.AppendLine("meta= {}"); builder.AppendLine("meta.__index = meta"); builder.AppendFormat("meta.__cname = '{0}'\n", fullType); //--常量字段 for (int j = 0; j < cls.Consts.Count; j++) { ConstWrap constant = cls.Consts[j]; if (!Util.MatchGroups(constant.Group)) { continue; } string value = constant.Value; switch (constant.FullName) { case Setting.BOOL: value = value.ToLower(); break; case Setting.STRING: value = string.Format("'{0}'", value); break; default: if (EnumWrap.IsEnum(constant.FullName)) { value = EnumWrap.Enums[constant.FullName].GetValue(constant.Value); } break; } builder.AppendFormat("meta.{0} = {1}\n", constant.Name, value); } builder.AppendFormat("GetOrCreate('{0}.{1}')['{2}'] = meta\n", Setting.ModuleName, cls.Namespace, cls.Name); string funcName = fullType.Replace(".", ""); if (cls.IsDynamic()) { builder.AppendFormat("function Stream:Get{0}Maker()\n", funcName); builder.Space().AppendFormat("return self['Get' .. self:GetString():gsub('%.', '')](self)\n"); builder.AppendFormat("end\n"); } builder.AppendFormat("function Stream:Get{0}()\n", funcName); if (!cls.Inherit.IsEmpty()) { builder.Space().AppendFormat("local o = self:Get{0}()\n", Util.CorrectFullType(cls.Inherit).Replace(".", "")); } else { builder.Space().AppendFormat("local o = {{}}\n"); } builder.Space().AppendFormat("setmetatable(o, {0})\n", fullType); //--普通字段 for (int j = 0; j < cls.Fields.Count; j++) { FieldWrap field = cls.Fields[j]; if (!Util.MatchGroups(field.Group)) { continue; } if (field.IsRaw) { builder.Space().AppendFormat("o.{0} = self:Get{1}()\n", field.Name, field.OriginalType.FirstCharUpper()); } else if (field.IsEnum) { builder.Space().AppendFormat("o.{0} = self:GetInt()\n", field.Name); } else if (field.IsClass) { if (field.IsDynamic) { builder.Space().AppendFormat("o.{0} = self:Get{1}Maker()\n", field.Name, Util.CorrectFullType(field.OriginalType).Replace(".", "")); } else { builder.Space().AppendFormat("o.{0} = self:Get{1}()\n", field.Name, Util.CorrectFullType(field.OriginalType).Replace(".", "")); } } else if (field.IsContainer) { if (field.OriginalType == Setting.LIST) { var item = field.GetItemDefine(); string index = Util.CorrectFullType(item.OriginalType).Replace(".", "").FirstCharUpper(); if (item.IsClass && item.IsDynamic) { index += "Maker"; } builder.Space().AppendFormat("o.{0} = self:GetList('{1}')\n", field.Name, index); } else if (field.OriginalType == Setting.DICT) { var k = field.GetKeyDefine(); string key = k.OriginalType.FirstCharUpper(); if (k.IsEnum) { key = "Int"; } var v = field.GetValueDefine(); string value = Util.CorrectFullType(v.OriginalType).Replace(".", "").FirstCharUpper(); if (v.IsClass && v.IsDynamic) { value += "Maker"; } else if (v.IsEnum) { value = "Int"; } builder.Space().AppendFormat("o.{0} = self:GetDict('{1}', '{2}')\n", field.Name, key, value); } } } builder.Space().AppendFormat("return o\n"); builder.AppendFormat("end\n"); } var eit = EnumWrap.Enums.GetEnumerator(); while (eit.MoveNext()) { EnumWrap en = eit.Current.Value; builder.AppendFormat("GetOrCreate('{0}.{1}')['{2}'] = {{\n", Setting.ModuleName, en.Namespace, en.Name); foreach (var item in en.Values) { builder.Space().AppendFormat("{0} = {1},\n", item.Key, item.Value); } builder.AppendLine("}"); } builder.AppendLine("return Stream"); string path = Path.Combine(Setting.LuaDir, DATA_STRUCT + ".lua"); Util.SaveFile(path, builder.ToString()); }
public FList(FClass host, FieldWrap define) : base(host, define) { _item = define.GetItemDefine(); }