【新增】config 容器元素为ref时,也为生成相应的ref变量并且resolve。 目前只支持c#

main
walon 2022-02-11 11:48:23 +08:00
parent e6203df5b3
commit e8805873ea
7 changed files with 96 additions and 26 deletions

View File

@ -25,29 +25,74 @@ namespace Luban.Job.Cfg.Defs
public RefValidator Ref { get; private set; } public RefValidator Ref { get; private set; }
// 如果ref了多个表不再生成 xxx_ref之类的字段也不会resolve private TType _refType;
public bool GenRef => Ref != null && Ref.GenRef;
public bool HasRecursiveRef => (CType is TBean tb && HostType.AssemblyBase.GetExternalTypeMapper(tb) == null) public TType RefType => _refType ??= Assembly.GetCfgTable(Ref.FirstTable).ValueTType;
|| (CType is TArray ta && ta.ElementType.IsBean)
|| (CType is TList tl && tl.ElementType.IsBean)
|| (CType is TMap tm && tm.ValueType.IsBean);
public string CsRefTypeName public RefValidator ElementRef { get; private set; }
private TType _eleRefType;
public TType ElementRefType
{ {
get get
{ {
var table = Assembly.GetCfgTable(Ref.FirstTable); if (_eleRefType == null)
return table.ValueTType.Apply(CsDefineTypeName.Ins); {
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 public string CsRefValidatorDefine
{ {
get get
{ {
var table = Assembly.GetCfgTable(Ref.FirstTable); if (Ref != null)
return $"{table.ValueTType.Apply(CsDefineTypeName.Ins)} {RefVarName} {{ get; private set; }}"; {
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; this.Ref = (RefValidator)selfRef;
} }
var eleType = CType.ElementType;
if (eleType != null)
{
ElementRef = (RefValidator)eleType.Processors.Find(p => p is RefValidator);
}
} }
private void ValidateIndex() private void ValidateIndex()

View File

@ -63,8 +63,11 @@ namespace Luban.Job.Cfg.Utils
{ {
var refVarName = field.RefVarName; var refVarName = field.RefVarName;
var name = field.ConventionName; var name = field.ConventionName;
if (field.Ref != null)
{
var tableName = field.Ref.FirstTable; var tableName = field.Ref.FirstTable;
var table = field.Assembly.GetCfgTable(field.Ref.FirstTable); var table = field.Assembly.GetCfgTable(tableName);
if (field.IsNullable) if (field.IsNullable)
{ {
return $"this.{refVarName} = this.{name} != null ? (_tables[\"{tableName}\"] as {table.FullName}).GetOrDefault({name}.Value) : null;"; return $"this.{refVarName} = this.{name} != null ? (_tables[\"{tableName}\"] as {table.FullName}).GetOrDefault({name}.Value) : null;";
@ -74,6 +77,29 @@ namespace Luban.Job.Cfg.Utils
return $"this.{refVarName} = (_tables[\"{tableName}\"] as {table.FullName}).GetOrDefault({name});"; return $"this.{refVarName} = (_tables[\"{tableName}\"] as {table.FullName}).GetOrDefault({name});";
} }
} }
else
{
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");
}
}
}
public static string JavaDeserialize(string bufName, string fieldName, TType type) public static string JavaDeserialize(string bufName, string fieldName, TType type)
{ {

View File

@ -76,7 +76,7 @@ namespace Luban.Job.Common.TypeVisitors
public override void Accept(TMap type, MapKeyValueEntryCollection x) public override void Accept(TMap type, MapKeyValueEntryCollection x)
{ {
x.KeyValueEntries[MakeKeyValueType(type)] = type; x.KeyValueEntries[MakeKeyValueType(type)] = type;
if (type.ElementType is TBean tbean) if (type.ValueType is TBean tbean)
{ {
tbean.Apply(this, x); tbean.Apply(this, x);
} }

View File

@ -20,6 +20,8 @@ namespace Luban.Job.Common.Types
public TType ValueType { get; } public TType ValueType { get; }
public override TType ElementType => ValueType;
public bool IsOrderedMap { get; } public bool IsOrderedMap { get; }
private TMap(bool isNullable, Dictionary<string, string> tags, TType keyType, TType valueType, bool isOrderedMap) : base(isNullable, tags) private TMap(bool isNullable, Dictionary<string, string> tags, TType keyType, TType valueType, bool isOrderedMap) : base(isNullable, tags)

View File

@ -151,9 +151,6 @@ public partial class {{name}}
/// </summary> /// </summary>
{{~end~}} {{~end~}}
public {{cs_define_type field.ctype}} {{field.convention_name}} => _data.{{field.convention_name}}; 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~}} {{~end~}}
public void Resolve(Dictionary<string, object> _tables) public void Resolve(Dictionary<string, object> _tables)

View File

@ -151,9 +151,6 @@ public sealed partial class {{name}}
/// </summary> /// </summary>
{{~end~}} {{~end~}}
public {{cs_define_type field.ctype}} {{field.convention_name}} => _data.{{field.convention_name}}; 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~}} {{~end~}}
public void Resolve(Dictionary<string, object> _tables) public void Resolve(Dictionary<string, object> _tables)

View File

@ -155,9 +155,6 @@ public sealed partial class {{name}}
/// </summary> /// </summary>
{{~end~}} {{~end~}}
public {{cs_define_type field.ctype}} {{field.convention_name}} => _data.{{field.convention_name}}; 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~}} {{~end~}}
public void Resolve(Dictionary<string, object> _tables) public void Resolve(Dictionary<string, object> _tables)