diff --git a/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs b/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs index 97613f7..2859b4e 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs @@ -69,7 +69,7 @@ namespace Luban.Job.Cfg.Defs public Dictionary GetTableDataMap(DefTable table) { - return _recordsMapByTables.GetValueOrDefault(table.FullName); + return _recordsMapByTables[table.FullName]; } public List GetExportTables() diff --git a/src/Luban.Job.Cfg/Source/Defs/DefField.cs b/src/Luban.Job.Cfg/Source/Defs/DefField.cs index 6c3165a..1dcc819 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefField.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefField.cs @@ -46,7 +46,7 @@ namespace Luban.Job.Cfg.Defs public RefValidator Ref { get; private set; } // 对于 two key map, 需要检查 ref,但不为它生成 ref 代码.故只有map类型表才要生成代码 - public bool GenRef => Ref != null && Assembly.GetCfgTable(Ref.FirstTable).IsMapTable; + public bool GenRef => Ref != null && Ref.Tables.Count == 1 && Assembly.GetCfgTable(Ref.FirstTable).IsMapTable; public bool HasRecursiveRef => (CType is TBean) || (CType is TArray ta && ta.ElementType is TBean) diff --git a/src/Luban.Job.Cfg/Source/ValidatorContext.cs b/src/Luban.Job.Cfg/Source/ValidatorContext.cs index 585027f..b71be20 100644 --- a/src/Luban.Job.Cfg/Source/ValidatorContext.cs +++ b/src/Luban.Job.Cfg/Source/ValidatorContext.cs @@ -61,27 +61,41 @@ namespace Luban.Job.Cfg public async Task ValidateTables(IEnumerable tables) { - var tasks = new List(); - foreach (var t in tables) { - tasks.Add(Task.Run(() => + var tasks = new List(); + foreach (var t in tables) { - var records = t.Assembly.GetTableDataList(t); - ValidateTableModeIndex(t, records); - - var visitor = new ValidatorVisitor(this); - try + tasks.Add(Task.Run(() => { - CurrentVisitor = visitor; - visitor.ValidateTable(t, records); - } - finally - { - CurrentVisitor = null; - } - })); + var records = t.Assembly.GetTableDataList(t); + ValidateTableModeIndex(t, records); + })); + } + await Task.WhenAll(tasks); } - await Task.WhenAll(tasks); + + { + var tasks = new List(); + foreach (var t in tables) + { + tasks.Add(Task.Run(() => + { + var records = t.Assembly.GetTableDataList(t); + var visitor = new ValidatorVisitor(this); + try + { + CurrentVisitor = visitor; + visitor.ValidateTable(t, records); + } + finally + { + CurrentVisitor = null; + } + })); + } + await Task.WhenAll(tasks); + } + if (!string.IsNullOrWhiteSpace(RootDir)) { await ValidatePaths(); diff --git a/src/Luban.Job.Cfg/Source/Validators/RefValidator.cs b/src/Luban.Job.Cfg/Source/Validators/RefValidator.cs index 0c8e0ed..a0d9197 100644 --- a/src/Luban.Job.Cfg/Source/Validators/RefValidator.cs +++ b/src/Luban.Job.Cfg/Source/Validators/RefValidator.cs @@ -54,13 +54,27 @@ namespace Luban.Job.Cfg.Validators } DefTable ct = assembly.GetCfgTable(actualTable); var recordMap = assembly.GetTableDataMap(ct); - if (recordMap != null && !recordMap.ContainsKey(key)) + if (/*recordMap != null &&*/ recordMap.ContainsKey(key)) { - string source = DataUtil.GetSourceFile(ValidatorContext.CurrentVisitor.CurrentValidateRecord); - assembly.Agent.Error("记录 {0} = {1} (来自文件:{2}) 在引用表:{3} 中不存在", ValidatorContext.CurrentRecordPath, key, source, table); + return; } } + foreach (var table in Tables) + { + string actualTable; + if (table.EndsWith("?")) + { + actualTable = table[0..^1]; + } + else + { + actualTable = table; + } + DefTable ct = assembly.GetCfgTable(actualTable); + string source = DataUtil.GetSourceFile(ValidatorContext.CurrentVisitor.CurrentValidateRecord); + assembly.Agent.Error("记录 {0} = {1} (来自文件:{2}) 在引用表:{3} 中不存在", ValidatorContext.CurrentRecordPath, key, source, table); + } } public void Compile(DefField def) diff --git a/src/Luban.Job.Cfg/Source/Validators/ValidatorFactory.cs b/src/Luban.Job.Cfg/Source/Validators/ValidatorFactory.cs index 88e9c1a..4efe0cc 100644 --- a/src/Luban.Job.Cfg/Source/Validators/ValidatorFactory.cs +++ b/src/Luban.Job.Cfg/Source/Validators/ValidatorFactory.cs @@ -1,6 +1,7 @@ using Luban.Config.Common.RawDefs; using System; using System.Collections.Generic; +using System.Linq; namespace Luban.Job.Cfg.Validators { @@ -14,7 +15,7 @@ namespace Luban.Job.Cfg.Validators { case RefValidator.NAME: { - return new RefValidator(new List { validator.Rule }); + return new RefValidator(validator.Rule.Split(',').ToList()); } case PathValidator.NAME: {