From e8805873eabe50a22e2835d60378e2d4ac4e89f6 Mon Sep 17 00:00:00 2001 From: walon Date: Fri, 11 Feb 2022 11:48:23 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91config=20?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E5=85=83=E7=B4=A0=E4=B8=BAref=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=B9=9F=E4=B8=BA=E7=94=9F=E6=88=90=E7=9B=B8=E5=BA=94?= =?UTF-8?q?=E7=9A=84ref=E5=8F=98=E9=87=8F=E5=B9=B6=E4=B8=94resolve?= =?UTF-8?q?=E3=80=82=20=E7=9B=AE=E5=89=8D=E5=8F=AA=E6=94=AF=E6=8C=81c#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Luban.Job.Cfg/Source/Defs/DefField.cs | 73 ++++++++++++++++--- .../Source/Utils/TTypeTemplateExtends.cs | 36 +++++++-- .../CollectMapKeyValueEntrysVisitor.cs | 2 +- src/Luban.Job.Common/Source/Types/TMap.cs | 2 + .../Templates/config/cs_bin/table.tpl | 3 - .../Templates/config/cs_json/table.tpl | 3 - .../Templates/config/cs_unity_json/table.tpl | 3 - 7 files changed, 96 insertions(+), 26 deletions(-) diff --git a/src/Luban.Job.Cfg/Source/Defs/DefField.cs b/src/Luban.Job.Cfg/Source/Defs/DefField.cs index d3abfa0..3958962 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefField.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefField.cs @@ -25,29 +25,74 @@ namespace Luban.Job.Cfg.Defs public RefValidator Ref { get; private set; } - // 如果ref了多个表,不再生成 xxx_ref之类的字段,也不会resolve - public bool GenRef => Ref != null && Ref.GenRef; + private TType _refType; - public bool HasRecursiveRef => (CType is TBean tb && HostType.AssemblyBase.GetExternalTypeMapper(tb) == null) - || (CType is TArray ta && ta.ElementType.IsBean) - || (CType is TList tl && tl.ElementType.IsBean) - || (CType is TMap tm && tm.ValueType.IsBean); + public TType RefType => _refType ??= Assembly.GetCfgTable(Ref.FirstTable).ValueTType; - public string CsRefTypeName + public RefValidator ElementRef { get; private set; } + + private TType _eleRefType; + + public TType ElementRefType { get { - var table = Assembly.GetCfgTable(Ref.FirstTable); - return table.ValueTType.Apply(CsDefineTypeName.Ins); + if (_eleRefType == null) + { + TType refValueType = Assembly.GetCfgTable(ElementRef.FirstTable).ValueTType; + _eleRefType = CType switch + { + TArray ta => TArray.Create(false, null, refValueType), + TList tl => TList.Create(false, null, refValueType, true), + TSet ts => TSet.Create(false, null, refValueType, false), + TMap tm => TMap.Create(false, null, tm.KeyType, refValueType, false), + _ => throw new Exception($"not support ref type:'{CType.TypeName}'"), + }; + } + return _eleRefType; } } + + // 如果ref了多个表,不再生成 xxx_ref之类的字段,也不会resolve + public bool GenRef + { + get + { + if(Ref != null) + { + return Ref.GenRef; + } + // 特殊处理, 目前只有c#支持.而这个属性已经被多种语言模板引用了,故单独处理一下 + if (DefAssemblyBase.LocalAssebmly.CurrentLanguage != Common.ELanguage.CS) + { + return false; + } + return ElementRef?.GenRef == true; + } + } + + public bool HasRecursiveRef => (CType is TBean tb && HostType.AssemblyBase.GetExternalTypeMapper(tb) == null) + || CType.ElementType?.IsBean == true; + + public string CsRefTypeName => RefType.Apply(CsDefineTypeName.Ins); + public string CsRefValidatorDefine { get { - var table = Assembly.GetCfgTable(Ref.FirstTable); - return $"{table.ValueTType.Apply(CsDefineTypeName.Ins)} {RefVarName} {{ get; private set; }}"; + if (Ref != null) + { + return $"{RefType.Apply(CsDefineTypeName.Ins)} {RefVarName} {{ get; private set; }}"; + } + else if (ElementRef != null) + { + return $"{ElementRefType.Apply(CsDefineTypeName.Ins)} {RefVarName} {{ get; private set; }}"; + } + else + { + throw new NotSupportedException(); + } } } @@ -125,6 +170,12 @@ namespace Luban.Job.Cfg.Defs { this.Ref = (RefValidator)selfRef; } + + var eleType = CType.ElementType; + if (eleType != null) + { + ElementRef = (RefValidator)eleType.Processors.Find(p => p is RefValidator); + } } private void ValidateIndex() diff --git a/src/Luban.Job.Cfg/Source/Utils/TTypeTemplateExtends.cs b/src/Luban.Job.Cfg/Source/Utils/TTypeTemplateExtends.cs index dc2f39e..7faafa9 100644 --- a/src/Luban.Job.Cfg/Source/Utils/TTypeTemplateExtends.cs +++ b/src/Luban.Job.Cfg/Source/Utils/TTypeTemplateExtends.cs @@ -63,15 +63,41 @@ namespace Luban.Job.Cfg.Utils { var refVarName = field.RefVarName; var name = field.ConventionName; - var tableName = field.Ref.FirstTable; - var table = field.Assembly.GetCfgTable(field.Ref.FirstTable); - if (field.IsNullable) + + if (field.Ref != null) { - return $"this.{refVarName} = this.{name} != null ? (_tables[\"{tableName}\"] as {table.FullName}).GetOrDefault({name}.Value) : null;"; + var tableName = field.Ref.FirstTable; + var table = field.Assembly.GetCfgTable(tableName); + if (field.IsNullable) + { + return $"this.{refVarName} = this.{name} != null ? (_tables[\"{tableName}\"] as {table.FullName}).GetOrDefault({name}.Value) : null;"; + } + else + { + return $"this.{refVarName} = (_tables[\"{tableName}\"] as {table.FullName}).GetOrDefault({name});"; + } } else { - return $"this.{refVarName} = (_tables[\"{tableName}\"] as {table.FullName}).GetOrDefault({name});"; + var tableName = field.ElementRef.FirstTable; + var table = field.Assembly.GetCfgTable(tableName); + switch (field.CType) + { + case TArray: + { + return $@"{{ int __n = {name}.Length; {table.FullName} __table = ({table.FullName})_tables[""{ tableName}""]; this.{refVarName} = new {table.ValueTType.Apply(CsDefineTypeName.Ins)}[__n]; for(int i = 0 ; i < __n ; i++) {{ this.{refVarName}[i] = __table.GetOrDefault({name}[i]); }} }}"; + } + case TList: + case TSet: + { + return $@"{{ {table.FullName} __table = ({table.FullName})_tables[""{ tableName}""]; this.{refVarName} = new {field.ElementRefType.Apply(CsDefineTypeName.Ins)}(); foreach(var __e in {name}) {{ this.{refVarName}.Add(__table.GetOrDefault(__e)); }} }}"; + } + case TMap: + { + return $@"{{ {table.FullName} __table = ({table.FullName})_tables[""{ tableName}""]; this.{refVarName} = new {field.ElementRefType.Apply(CsDefineTypeName.Ins)}(); foreach(var __e in {name}) {{ this.{refVarName}.Add(__e.Key, __table.GetOrDefault(__e.Value)); }} }}"; + } + default: throw new NotSupportedException($"type:'{field.CType.TypeName}' not support ref"); + } } } diff --git a/src/Luban.Job.Common/Source/TypeVisitors/CollectMapKeyValueEntrysVisitor.cs b/src/Luban.Job.Common/Source/TypeVisitors/CollectMapKeyValueEntrysVisitor.cs index b35a5bc..6d599ba 100644 --- a/src/Luban.Job.Common/Source/TypeVisitors/CollectMapKeyValueEntrysVisitor.cs +++ b/src/Luban.Job.Common/Source/TypeVisitors/CollectMapKeyValueEntrysVisitor.cs @@ -76,7 +76,7 @@ namespace Luban.Job.Common.TypeVisitors public override void Accept(TMap type, MapKeyValueEntryCollection x) { x.KeyValueEntries[MakeKeyValueType(type)] = type; - if (type.ElementType is TBean tbean) + if (type.ValueType is TBean tbean) { tbean.Apply(this, x); } diff --git a/src/Luban.Job.Common/Source/Types/TMap.cs b/src/Luban.Job.Common/Source/Types/TMap.cs index 189647c..ad14fb5 100644 --- a/src/Luban.Job.Common/Source/Types/TMap.cs +++ b/src/Luban.Job.Common/Source/Types/TMap.cs @@ -20,6 +20,8 @@ namespace Luban.Job.Common.Types public TType ValueType { get; } + public override TType ElementType => ValueType; + public bool IsOrderedMap { get; } private TMap(bool isNullable, Dictionary tags, TType keyType, TType valueType, bool isOrderedMap) : base(isNullable, tags) diff --git a/src/Luban.Server/Templates/config/cs_bin/table.tpl b/src/Luban.Server/Templates/config/cs_bin/table.tpl index 4f54377..1216e19 100644 --- a/src/Luban.Server/Templates/config/cs_bin/table.tpl +++ b/src/Luban.Server/Templates/config/cs_bin/table.tpl @@ -151,9 +151,6 @@ public partial class {{name}} /// {{~end~}} public {{cs_define_type field.ctype}} {{field.convention_name}} => _data.{{field.convention_name}}; - {{~if field.ref~}} - public {{field.cs_ref_type_name}} {{field.ref_var_name}} => _data.{{field.ref_var_name}}; - {{~end~}} {{~end~}} public void Resolve(Dictionary _tables) diff --git a/src/Luban.Server/Templates/config/cs_json/table.tpl b/src/Luban.Server/Templates/config/cs_json/table.tpl index 08d715d..c6a1f0c 100644 --- a/src/Luban.Server/Templates/config/cs_json/table.tpl +++ b/src/Luban.Server/Templates/config/cs_json/table.tpl @@ -151,9 +151,6 @@ public sealed partial class {{name}} /// {{~end~}} public {{cs_define_type field.ctype}} {{field.convention_name}} => _data.{{field.convention_name}}; - {{~if field.ref~}} - public {{field.cs_ref_type_name}} {{field.ref_var_name}} => _data.{{field.ref_var_name}}; - {{~end~}} {{~end~}} public void Resolve(Dictionary _tables) diff --git a/src/Luban.Server/Templates/config/cs_unity_json/table.tpl b/src/Luban.Server/Templates/config/cs_unity_json/table.tpl index ea9b774..13c2bd1 100644 --- a/src/Luban.Server/Templates/config/cs_unity_json/table.tpl +++ b/src/Luban.Server/Templates/config/cs_unity_json/table.tpl @@ -155,9 +155,6 @@ public sealed partial class {{name}} /// {{~end~}} public {{cs_define_type field.ctype}} {{field.convention_name}} => _data.{{field.convention_name}}; - {{~if field.ref~}} - public {{field.cs_ref_type_name}} {{field.ref_var_name}} => _data.{{field.ref_var_name}}; - {{~end~}} {{~end~}} public void Resolve(Dictionary _tables)