【新增】config 容器元素为ref时,也为生成相应的ref变量并且resolve。 目前只支持c#
parent
e6203df5b3
commit
e8805873ea
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -63,8 +63,11 @@ namespace Luban.Job.Cfg.Utils
|
|||
{
|
||||
var refVarName = field.RefVarName;
|
||||
var name = field.ConventionName;
|
||||
|
||||
if (field.Ref != null)
|
||||
{
|
||||
var tableName = field.Ref.FirstTable;
|
||||
var table = field.Assembly.GetCfgTable(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;";
|
||||
|
|
@ -74,6 +77,29 @@ namespace Luban.Job.Cfg.Utils
|
|||
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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<string, string> tags, TType keyType, TType valueType, bool isOrderedMap) : base(isNullable, tags)
|
||||
|
|
|
|||
|
|
@ -151,9 +151,6 @@ public partial class {{name}}
|
|||
/// </summary>
|
||||
{{~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<string, object> _tables)
|
||||
|
|
|
|||
|
|
@ -151,9 +151,6 @@ public sealed partial class {{name}}
|
|||
/// </summary>
|
||||
{{~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<string, object> _tables)
|
||||
|
|
|
|||
|
|
@ -155,9 +155,6 @@ public sealed partial class {{name}}
|
|||
/// </summary>
|
||||
{{~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<string, object> _tables)
|
||||
|
|
|
|||
Loading…
Reference in New Issue