Esempio n. 1
0
        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("}");
            }
        }
Esempio n. 2
0
        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;");
                }
            }
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        /// <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());
        }
Esempio n. 5
0
 public FList(FClass host, FieldWrap define) : base(host, define)
 {
     _item = define.GetItemDefine();
 }