From ff93a074c497059e5c7d4e997622fabf339610f6 Mon Sep 17 00:00:00 2001 From: walon Date: Thu, 2 Dec 2021 10:52:06 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E8=B0=83=E6=95=B4=E3=80=91=E8=B0=83?= =?UTF-8?q?=E6=95=B4xlsx=E4=B8=AD=E5=AE=9A=E4=B9=89enum=E7=9A=84=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E3=80=82=E5=AE=8C=E6=95=B4=E5=AF=B9=E5=BA=94xml?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +++-- src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs | 79 +++++++++++++------ src/Luban.Job.Cfg/Source/RawDefs/Defines.cs | 8 +- .../Source/Defs/CommonDefLoader.cs | 22 ++++++ src/Luban.Job.Common/Source/GenArgsBase.cs | 3 + .../Source/RawDefs/DefinesCommon.cs | 19 +++++ src/Luban.Job.Db/Source/Defs/DbDefLoader.cs | 7 +- src/Luban.Job.Db/Source/RawDefs/Defines.cs | 8 +- .../Source/Defs/ProtoDefLoader.cs | 7 +- src/Luban.Job.Proto/Source/RawDefs/Defines.cs | 8 +- 10 files changed, 120 insertions(+), 59 deletions(-) create mode 100644 src/Luban.Job.Common/Source/RawDefs/DefinesCommon.cs diff --git a/README.md b/README.md index f74180e..69164eb 100644 --- a/README.md +++ b/README.md @@ -188,11 +188,15 @@ array与list类型都能表示列表,它们区别在于array生成的代码为 ``` 或者在 \_\_enums\_\_.xlsx 中 定义 -|##|full_name|item|alias|value|comment|tags| -|- | - | - | - | - | - | - | -||ItemQuality|WHITE|白|1||| -||ItemQuality|GREEN|绿|2||| -||ItemQuality|RED|红|3||| + + + + + + + + +
##full_nameflagsuniquecommenttags*items
##+namealiasvaluecommenttags
ItemQualityfalsetrueWHITE0
GREEN绿1
RED2
数据表如下 @@ -360,8 +364,8 @@ xml中定义如下 1task1110desc1212desc2313desc3 -2task1330desc3440desc4 -3task1550desc5 +2task1330desc3440desc4 +3task1550desc5 ### 多行结构列表 diff --git a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs index eae5484..49e592b 100644 --- a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs +++ b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs @@ -52,16 +52,15 @@ namespace Luban.Job.Cfg.Defs public Defines BuildDefines() { - return new Defines() + var defines = new Defines() { - TopModule = TopModule, Patches = _patches, - Enums = _enums, - Beans = _beans, Tables = _cfgTables, Services = _cfgServices, Groups = _cfgGroups, }; + BuildCommonDefines(defines); + return defines; } private static readonly List _excelImportRequireAttrs = new List { "name", "type" }; @@ -480,6 +479,36 @@ namespace Luban.Job.Cfg.Defs } var inputFileInfos = await DataLoaderUtil.CollectInputFilesAsync(this.Agent, this._importExcelEnumFiles, dataDir); + + var ass = new DefAssembly("", null, new List(), Agent); + + var enumItemType = new DefBean(new CfgBean() + { + Namespace = "__intern__", + Name = "__EnumItem__", + Parent = "", + Alias = "", + IsValueType = false, + Sep = "", + TypeId = 0, + IsSerializeCompatible = false, + Fields = new List + { + new CfgField() { Name = "name", Type = "string" }, + new CfgField() { Name = "alias", Type = "string" }, + new CfgField() { Name = "value", Type = "string" }, + new CfgField() { Name = "comment", Type = "string" }, + new CfgField() { Name = "tags", Type = "string" }, + } + }) + { + AssemblyBase = ass, + }; + ass.AddType(enumItemType); + enumItemType.PreCompile(); + enumItemType.Compile(); + enumItemType.PostCompile(); + var defTableRecordType = new DefBean(new CfgBean() { Namespace = "__intern__", @@ -493,16 +522,17 @@ namespace Luban.Job.Cfg.Defs Fields = new List { new CfgField() { Name = "full_name", Type = "string" }, - new CfgField() { Name = "item", Type = "string" }, - new CfgField() { Name = "alias", Type = "string" }, - new CfgField() { Name = "value", Type = "int" }, new CfgField() { Name = "comment", Type = "string" }, + new CfgField() { Name = "flags", Type = "bool" }, new CfgField() { Name = "tags", Type = "string" }, + new CfgField() { Name = "unique", Type = "bool" }, + new CfgField() { Name = "items", Type = "list,__EnumItem__" }, } }) { - AssemblyBase = new DefAssembly("", null, new List(), Agent), + AssemblyBase = ass, }; + ass.AddType(defTableRecordType); defTableRecordType.PreCompile(); defTableRecordType.Compile(); defTableRecordType.PostCompile(); @@ -514,7 +544,6 @@ namespace Luban.Job.Cfg.Defs var bytes = await this.Agent.GetFromCacheOrReadAllBytesAsync(file.ActualFile, file.MD5); var records = DataLoaderUtil.LoadCfgRecords(tableRecordType, file.OriginFile, null, bytes, true); - PEnum curEnum = null; foreach (var r in records) { DBean data = r.Data; @@ -527,22 +556,26 @@ namespace Luban.Job.Cfg.Defs } string module = TypeUtil.GetNamespace(fullName); - if (curEnum == null || curEnum.Name != name || curEnum.Namespace != module) - { - curEnum = new PEnum() { Name = name, Namespace = module, IsFlags = false, Comment = "", IsUniqueItemId = true }; - this._enums.Add(curEnum); - } + DList items = (data.GetField("items") as DList); - string item = (data.GetField("item") as DString).Value.Trim(); - if (string.IsNullOrWhiteSpace(item)) + var curEnum = new PEnum() { - throw new Exception($"file:{file.ActualFile} module:'{module}' name:'{name}' 定义了一个空枚举项"); - } - string alias = (data.GetField("alias") as DString).Value.Trim(); - string value = (data.GetField("value") as DInt).Value.ToString(); - string comment = (data.GetField("comment") as DString).Value.Trim(); - string tags = (data.GetField("tags") as DString).Value.Trim(); - curEnum.Items.Add(new EnumItem() { Name = item, Alias = alias, Value = value, Comment = comment, Tags = tags }); + Name = name, + Namespace = module, + IsFlags = (data.GetField("flags") as DBool).Value, + Tags = (data.GetField("tags") as DString).Value, + Comment = (data.GetField("comment") as DString).Value, + IsUniqueItemId = (data.GetField("unique") as DBool).Value, + Items = items.Datas.Cast().Select(d => new EnumItem() + { + Name = (d.GetField("name") as DString).Value, + Alias = (d.GetField("alias") as DString).Value, + Value = (d.GetField("value") as DString).Value, + Comment = (d.GetField("comment") as DString).Value, + Tags = (d.GetField("tags") as DString).Value, + }).ToList(), + }; + this._enums.Add(curEnum); }; } } diff --git a/src/Luban.Job.Cfg/Source/RawDefs/Defines.cs b/src/Luban.Job.Cfg/Source/RawDefs/Defines.cs index 0b9d2d2..9c6d04a 100644 --- a/src/Luban.Job.Cfg/Source/RawDefs/Defines.cs +++ b/src/Luban.Job.Cfg/Source/RawDefs/Defines.cs @@ -3,16 +3,10 @@ using System.Collections.Generic; namespace Luban.Job.Cfg.RawDefs { - public class Defines + public class Defines : DefinesCommon { - public string TopModule { get; set; } = ""; - public List Patches { get; set; } = new List(); - public List Beans { get; set; } = new List(); - - public List Enums { get; set; } = new List(); - public List Tables { get; set; } = new List
(); public List Groups { get; set; } = new List(); diff --git a/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs b/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs index 0b9bc92..1ab4e40 100644 --- a/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs +++ b/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs @@ -49,12 +49,14 @@ namespace Luban.Job.Common.Defs protected readonly List _enums = new List(); protected readonly List _beans = new List(); + protected readonly HashSet _externalSelectors = new(); protected CommonDefLoader(IAgent agent) { Agent = agent; _rootDefineHandlers.Add("topmodule", SetTopModule); + _rootDefineHandlers.Add("externalselector", AddExternalSelector); _moduleDefineHandlers.Add("module", AddModule); _moduleDefineHandlers.Add("enum", AddEnum); @@ -103,6 +105,14 @@ namespace Luban.Job.Common.Defs protected string CurNamespace => _namespaceStack.Count > 0 ? _namespaceStack.Peek() : ""; + protected void BuildCommonDefines(DefinesCommon defines) + { + defines.TopModule = TopModule; + defines.Enums = _enums; + defines.Beans = _beans; + defines.ExternalSelectors = _externalSelectors; + } + #region root handler private void SetTopModule(XElement e) @@ -327,6 +337,18 @@ namespace Luban.Job.Common.Defs s_logger.Trace("add enum:{@enum}", en); _enums.Add(en); } + + private static readonly List _selectorRequiredAttrs = new List { "name" }; + private void AddExternalSelector(XElement e) + { + ValidAttrKeys(_rootXml, e, null, _selectorRequiredAttrs); + string name = XmlUtil.GetRequiredAttribute(e, "name"); + if (!_externalSelectors.Add(name)) + { + throw new LoadDefException($"定义文件:{_rootXml} externalselector name:{name} 重复"); + } + s_logger.Info("add selector:{}", name); + } #endregion } } diff --git a/src/Luban.Job.Common/Source/GenArgsBase.cs b/src/Luban.Job.Common/Source/GenArgsBase.cs index a5ec457..aa9cb2a 100644 --- a/src/Luban.Job.Common/Source/GenArgsBase.cs +++ b/src/Luban.Job.Common/Source/GenArgsBase.cs @@ -53,6 +53,9 @@ namespace Luban.Job.Common [Option("cs:use_unity_vector", Required = false, HelpText = "use UnityEngine.Vector{2,3,4}")] public bool CsUseUnityVectors { get; set; } + [Option("external:selectors", Required = false, HelpText = "external selectors")] + public string ExternalSelectors { get; set; } + public AccessConvention AccessConventionBeanMember { get; set; } public bool ValidateOutouptCodeDir(ref string errMsg) diff --git a/src/Luban.Job.Common/Source/RawDefs/DefinesCommon.cs b/src/Luban.Job.Common/Source/RawDefs/DefinesCommon.cs new file mode 100644 index 0000000..289c868 --- /dev/null +++ b/src/Luban.Job.Common/Source/RawDefs/DefinesCommon.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Luban.Job.Common.RawDefs +{ + public class DefinesCommon + { + public string TopModule { get; set; } = ""; + + public HashSet ExternalSelectors { get; set; } = new HashSet(); + + public List Beans { get; set; } = new List(); + + public List Enums { get; set; } = new List(); + } +} diff --git a/src/Luban.Job.Db/Source/Defs/DbDefLoader.cs b/src/Luban.Job.Db/Source/Defs/DbDefLoader.cs index 3e199d8..fc196e9 100644 --- a/src/Luban.Job.Db/Source/Defs/DbDefLoader.cs +++ b/src/Luban.Job.Db/Source/Defs/DbDefLoader.cs @@ -20,13 +20,12 @@ namespace Luban.Job.Db.Defs public Defines BuildDefines() { - return new Defines() + var defines = new Defines() { - TopModule = TopModule, - Enums = _enums, - Beans = _beans, DbTables = _tables, }; + BuildCommonDefines(defines); + return defines; } private readonly List _tableOptionalAttrs = new List { "memory", "comment" }; diff --git a/src/Luban.Job.Db/Source/RawDefs/Defines.cs b/src/Luban.Job.Db/Source/RawDefs/Defines.cs index 9f9eaf2..2ab49be 100644 --- a/src/Luban.Job.Db/Source/RawDefs/Defines.cs +++ b/src/Luban.Job.Db/Source/RawDefs/Defines.cs @@ -3,14 +3,8 @@ using System.Collections.Generic; namespace Luban.Job.Db.RawDefs { - public class Defines + public class Defines : DefinesCommon { - public string TopModule { get; set; } = ""; - - public List Beans { get; set; } = new List(); - - public List Enums { get; set; } = new List(); - public List
DbTables { get; set; } = new List
(); } } diff --git a/src/Luban.Job.Proto/Source/Defs/ProtoDefLoader.cs b/src/Luban.Job.Proto/Source/Defs/ProtoDefLoader.cs index c97d27d..2b2282b 100644 --- a/src/Luban.Job.Proto/Source/Defs/ProtoDefLoader.cs +++ b/src/Luban.Job.Proto/Source/Defs/ProtoDefLoader.cs @@ -24,14 +24,13 @@ namespace Luban.Job.Proto.Defs public Defines BuildDefines() { - return new Defines() + var defines = new Defines() { - TopModule = TopModule, - Enums = _enums, - Beans = _beans, Protos = _protos, Rpcs = _rpcs, }; + BuildCommonDefines(defines); + return defines; } private readonly List rpcAttrs = new List { "id" }; diff --git a/src/Luban.Job.Proto/Source/RawDefs/Defines.cs b/src/Luban.Job.Proto/Source/RawDefs/Defines.cs index 3a0d5e1..49aa4a7 100644 --- a/src/Luban.Job.Proto/Source/RawDefs/Defines.cs +++ b/src/Luban.Job.Proto/Source/RawDefs/Defines.cs @@ -3,16 +3,10 @@ using System.Collections.Generic; namespace Luban.Job.Proto.RawDefs { - public class Defines + public class Defines : DefinesCommon { - public string TopModule { get; set; } = ""; - public List ProtoServices { get; set; } = new List(); - public List Beans { get; set; } = new List(); - - public List Enums { get; set; } = new List(); - public List Protos { get; set; } = new List(); public List Rpcs { get; set; } = new List();