From 6b1669e0501289d03282121a0afb9c4ae782cd08 Mon Sep 17 00:00:00 2001 From: walon Date: Thu, 10 Feb 2022 15:07:09 +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=B4externaltype=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/DataConverts/FillSheetVisitor.cs | 2 +- src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs | 1 - src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs | 5 + src/Luban.Job.Cfg/Source/Defs/DefBean.cs | 3 +- src/Luban.Job.Cfg/Source/Defs/DefField.cs | 2 +- .../Source/Defs/CommonDefLoader.cs | 17 ++- .../Source/Defs/DefAssemblyBase.cs | 43 +++++- .../Source/Defs/DefBeanBase.cs | 3 - src/Luban.Job.Common/Source/Defs/DefEnum.cs | 2 - .../Source/Defs/DefTypeBase.cs | 37 +----- src/Luban.Job.Common/Source/RawDefs/Bean.cs | 2 - .../Source/RawDefs/ExternalType.cs | 4 +- src/Luban.Job.Common/Source/RawDefs/PEnum.cs | 2 - .../TypeVisitors/RawDefineTypeNameVisitor.cs | 124 ++++++++++++++++++ .../Source/Utils/ExternalTypeUtil.cs | 26 +++- 15 files changed, 207 insertions(+), 66 deletions(-) create mode 100644 src/Luban.Job.Common/Source/TypeVisitors/RawDefineTypeNameVisitor.cs diff --git a/src/Luban.Job.Cfg/Source/DataConverts/FillSheetVisitor.cs b/src/Luban.Job.Cfg/Source/DataConverts/FillSheetVisitor.cs index 45514f3..70197dd 100644 --- a/src/Luban.Job.Cfg/Source/DataConverts/FillSheetVisitor.cs +++ b/src/Luban.Job.Cfg/Source/DataConverts/FillSheetVisitor.cs @@ -132,7 +132,7 @@ namespace Luban.Job.Cfg.DataConverts { if (!x.SubTitles.TryGetValue(DefBean.TYPE_NAME_KEY, out var typeTitle)) { - throw new Exception($"多态bean:{data.Type.FullName} 缺失 __type__ 标题列"); + throw new Exception($"多态bean:{data.Type.FullName} 缺失 {DefBean.TYPE_NAME_KEY} 标题列"); } if (data.ImplType != null) { diff --git a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs index 8ef2708..d461433 100644 --- a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs +++ b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs @@ -789,7 +789,6 @@ namespace Luban.Job.Cfg.Defs Sep = XmlUtil.GetOptionalAttribute(e, "sep"), Comment = XmlUtil.GetOptionalAttribute(e, "comment"), Tags = XmlUtil.GetOptionalAttribute(e, "tags"), - ExternalType = XmlUtil.GetOptionalAttribute(e, "externaltype"), }; var childBeans = new List(); diff --git a/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs b/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs index 6096cd0..da64749 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs @@ -359,6 +359,11 @@ namespace Luban.Job.Cfg.Defs throw; } } + + foreach (var externalType in defines.ExternalTypes.Values) + { + AddExternalType(externalType); + } } } } diff --git a/src/Luban.Job.Cfg/Source/Defs/DefBean.cs b/src/Luban.Job.Cfg/Source/Defs/DefBean.cs index 5f1a866..173da5b 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefBean.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefBean.cs @@ -12,6 +12,7 @@ namespace Luban.Job.Cfg.Defs { public const string TYPE_NAME_KEY = "__type__"; + public const string BEAN_NULL_STR = "null"; public const string BEAN_NOT_NULL_STR = "{}"; @@ -168,8 +169,6 @@ namespace Luban.Job.Cfg.Defs public override void Compile() { - ResolveExternalType(); - var cs = new List(); if (Children != null) { diff --git a/src/Luban.Job.Cfg/Source/Defs/DefField.cs b/src/Luban.Job.Cfg/Source/Defs/DefField.cs index e6958ee..d3abfa0 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefField.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefField.cs @@ -28,7 +28,7 @@ namespace Luban.Job.Cfg.Defs // 如果ref了多个表,不再生成 xxx_ref之类的字段,也不会resolve public bool GenRef => Ref != null && Ref.GenRef; - public bool HasRecursiveRef => (CType is TBean tb && tb.Bean.CurrentExternalTypeMapper == null) + 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); diff --git a/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs b/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs index 6256548..38b4c61 100644 --- a/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs +++ b/src/Luban.Job.Common/Source/Defs/CommonDefLoader.cs @@ -217,7 +217,7 @@ namespace Luban.Job.Common.Defs private static readonly List _beanOptinsAttrs1 = new List { "compatible", "value_type", "comment", "tags", "externaltype" }; private static readonly List _beanRequireAttrs1 = new List { "id", "name" }; - private static readonly List _beanOptinsAttrs2 = new List { "id", "parent", "compatible", "value_type", "comment", "tags", "externaltype" }; + private static readonly List _beanOptinsAttrs2 = new List { "id", "parent", "compatible", "value_type", "comment", "tags"}; private static readonly List _beanRequireAttrs2 = new List { "name" }; @@ -257,7 +257,6 @@ namespace Luban.Job.Common.Defs IsValueType = XmlUtil.GetOptionBoolAttribute(e, "value_type"), Comment = XmlUtil.GetOptionalAttribute(e, "comment"), Tags = XmlUtil.GetOptionalAttribute(e, "tags"), - ExternalType = XmlUtil.GetOptionalAttribute(e, "externaltype"), }; var childBeans = new List(); @@ -321,7 +320,7 @@ namespace Luban.Job.Common.Defs } } - private static readonly List _enumOptionalAttrs = new List { "flags", "comment", "tags", "unique", "externaltype" }; + private static readonly List _enumOptionalAttrs = new List { "flags", "comment", "tags", "unique" }; private static readonly List _enumRequiredAttrs = new List { "name" }; @@ -339,7 +338,6 @@ namespace Luban.Job.Common.Defs IsFlags = XmlUtil.GetOptionBoolAttribute(e, "flags"), Tags = XmlUtil.GetOptionalAttribute(e, "tags"), IsUniqueItemId = XmlUtil.GetOptionBoolAttribute(e, "unique", true), - ExternalType = XmlUtil.GetOptionalAttribute(e, "externaltype"), }; foreach (XElement item in e.Elements()) @@ -370,7 +368,7 @@ namespace Luban.Job.Common.Defs s_logger.Trace("add selector:{}", name); } - private static readonly List _externalRequiredAttrs = new List { "name" }; + private static readonly List _externalRequiredAttrs = new List { "name", "origin_type_name" }; private void AddExternalType(string defineFile, XElement e) { ValidAttrKeys(_rootXml, e, null, _externalRequiredAttrs); @@ -384,6 +382,7 @@ namespace Luban.Job.Common.Defs var et = new ExternalType() { Name = name, + OriginTypeName = XmlUtil.GetRequiredAttribute(e, "origin_type_name"), }; var mappers = new Dictionary(); foreach (XElement mapperEle in e.Elements()) @@ -424,9 +423,9 @@ namespace Luban.Job.Common.Defs var tagName = attrEle.Name.LocalName; switch (tagName) { - case "typename": + case "target_type_name": { - m.TypeName = attrEle.Value; + m.TargetTypeName = attrEle.Value; break; } case "create_external_object_function": @@ -437,9 +436,9 @@ namespace Luban.Job.Common.Defs default: throw new LoadDefException($"定义文件:{defineFile} externaltype:{externalType} 非法 tag:{tagName}"); } } - if (string.IsNullOrWhiteSpace(m.TypeName)) + if (string.IsNullOrWhiteSpace(m.TargetTypeName)) { - throw new LoadDefException($"定义文件:{defineFile} externaltype:{externalType} lan:{m.Lan} selector:{m.Selector} 没有定义 typename"); + throw new LoadDefException($"定义文件:{defineFile} externaltype:{externalType} lan:{m.Lan} selector:{m.Selector} 没有定义 'target_type_name'"); } return m; } diff --git a/src/Luban.Job.Common/Source/Defs/DefAssemblyBase.cs b/src/Luban.Job.Common/Source/Defs/DefAssemblyBase.cs index 884831b..434f5f7 100644 --- a/src/Luban.Job.Common/Source/Defs/DefAssemblyBase.cs +++ b/src/Luban.Job.Common/Source/Defs/DefAssemblyBase.cs @@ -2,6 +2,7 @@ using Luban.Common.Utils; using Luban.Job.Common.RawDefs; using Luban.Job.Common.Types; +using Luban.Job.Common.TypeVisitors; using Luban.Job.Common.Utils; using Luban.Server.Common; using System; @@ -61,6 +62,8 @@ namespace Luban.Job.Common.Defs private Dictionary ExternalTypes { get; set; } + private readonly Dictionary _externalTypesByTypeName = new(); + public List CurrentExternalSelectors { get; private set; } public Dictionary Options { get; private set; } @@ -119,9 +122,45 @@ namespace Luban.Job.Common.Defs NamingConventionEnumMember = args.NamingConventionEnumMember; } - public bool TryGetExternalType(string typeName, out ExternalType type) + public ExternalTypeMapper GetExternalTypeMapper(TType type) { - return ExternalTypes.TryGetValue(typeName, out type); + return GetExternalTypeMapper(type.Apply(RawDefineTypeNameVisitor.Ins)); + } + + public ExternalTypeMapper GetExternalTypeMapper(string typeName) + { + ExternalType externalType = _externalTypesByTypeName.GetValueOrDefault(typeName); + if (externalType == null) + { + return null; + } + return externalType.Mappers.Find(m => m.Lan == CurrentLanguage && CurrentExternalSelectors.Contains(m.Selector)); + } + + public ExternalType GetExternalType(string typeName) + { + return _externalTypesByTypeName.GetValueOrDefault(typeName); + } + + private static readonly HashSet s_internalOriginTypes = new HashSet + { + "vector2", + "vector3", + "vector4", + "datetime", + }; + + public void AddExternalType(ExternalType type) + { + string originTypeName = type.OriginTypeName; + if (!Types.ContainsKey(originTypeName) && !s_internalOriginTypes.Contains(originTypeName)) + { + throw new LoadDefException($"externaltype:'{type.Name}' originTypeName:'{originTypeName}' 不存在"); + } + if (!_externalTypesByTypeName.TryAdd(originTypeName, type)) + { + throw new LoadDefException($"type:'{originTypeName} 被重复映射. externaltype1:'{type.Name}' exteraltype2:'{_externalTypesByTypeName[originTypeName].Name}'"); + } } public void AddType(DefTypeBase type) diff --git a/src/Luban.Job.Common/Source/Defs/DefBeanBase.cs b/src/Luban.Job.Common/Source/Defs/DefBeanBase.cs index 81496c2..970ccf7 100644 --- a/src/Luban.Job.Common/Source/Defs/DefBeanBase.cs +++ b/src/Luban.Job.Common/Source/Defs/DefBeanBase.cs @@ -52,7 +52,6 @@ namespace Luban.Job.Common.Defs IsValueType = b.IsValueType; Comment = b.Comment; Tags = DefUtil.ParseAttrs(b.Tags); - _externalTypeName = b.ExternalType; foreach (var field in b.Fields) { Fields.Add(CreateField(field, 0)); @@ -159,8 +158,6 @@ namespace Luban.Job.Common.Defs public override void Compile() { - base.Compile(); - var cs = new List(); if (Children != null) { diff --git a/src/Luban.Job.Common/Source/Defs/DefEnum.cs b/src/Luban.Job.Common/Source/Defs/DefEnum.cs index 0d4fcac..ffbf152 100644 --- a/src/Luban.Job.Common/Source/Defs/DefEnum.cs +++ b/src/Luban.Job.Common/Source/Defs/DefEnum.cs @@ -99,7 +99,6 @@ namespace Luban.Job.Common.Defs IsUniqueItemId = e.IsUniqueItemId; Comment = e.Comment; Tags = DefUtil.ParseAttrs(e.Tags); - _externalTypeName = e.ExternalType; foreach (var item in e.Items) { Items.Add(new Item @@ -116,7 +115,6 @@ namespace Luban.Job.Common.Defs public override void Compile() { - base.Compile(); var fullName = FullName; int lastEnumValue = -1; diff --git a/src/Luban.Job.Common/Source/Defs/DefTypeBase.cs b/src/Luban.Job.Common/Source/Defs/DefTypeBase.cs index 735f23b..32c963a 100644 --- a/src/Luban.Job.Common/Source/Defs/DefTypeBase.cs +++ b/src/Luban.Job.Common/Source/Defs/DefTypeBase.cs @@ -21,10 +21,6 @@ namespace Luban.Job.Common.Defs public string Namespace { get; set; } - protected string _externalTypeName; - - public ExternalType ExternalType { get; private set; } - public string FullName => TypeUtil.MakeFullName(Namespace, Name); public string NamespaceWithTopModule => TypeUtil.MakeNamespace(AssemblyBase.TopModule, Namespace); @@ -79,40 +75,9 @@ namespace Luban.Job.Common.Defs return Tags != null && Tags.TryGetValue(attrName, out var value) ? value : null; } - public ExternalTypeMapper CurrentExternalTypeMapper - { - get - { - if (ExternalType == null) - { - return null; - } - - return ExternalType.Mappers.Find(m => m.Lan == this.AssemblyBase.CurrentLanguage && this.AssemblyBase.CurrentExternalSelectors.Contains(m.Selector)); - } - } - - protected void ResolveExternalType() - { - if (!string.IsNullOrEmpty(_externalTypeName)) - { - if (AssemblyBase.TryGetExternalType(_externalTypeName, out var type)) - { - this.ExternalType = type; - } - else - { - throw new Exception($"enum:'{FullName}' Ӧ externaltype:{_externalTypeName} "); - } - } - } - public virtual void PreCompile() { } - public virtual void Compile() - { - ResolveExternalType(); - } + public abstract void Compile(); public virtual void PostCompile() { } } diff --git a/src/Luban.Job.Common/Source/RawDefs/Bean.cs b/src/Luban.Job.Common/Source/RawDefs/Bean.cs index faf84b4..27a6ae9 100644 --- a/src/Luban.Job.Common/Source/RawDefs/Bean.cs +++ b/src/Luban.Job.Common/Source/RawDefs/Bean.cs @@ -22,8 +22,6 @@ namespace Luban.Job.Common.RawDefs public string Tags { get; set; } - public string ExternalType { get; set; } - public List Fields { get; set; } = new List(); } } diff --git a/src/Luban.Job.Common/Source/RawDefs/ExternalType.cs b/src/Luban.Job.Common/Source/RawDefs/ExternalType.cs index 01f9062..a17f69e 100644 --- a/src/Luban.Job.Common/Source/RawDefs/ExternalType.cs +++ b/src/Luban.Job.Common/Source/RawDefs/ExternalType.cs @@ -13,7 +13,7 @@ namespace Luban.Job.Common.RawDefs public ELanguage Lan { get; set; } - public string TypeName { get; set; } + public string TargetTypeName { get; set; } public string CreateExternalObjectFunction { get; set; } } @@ -22,6 +22,8 @@ namespace Luban.Job.Common.RawDefs { public string Name { get; set; } + public string OriginTypeName { get; set; } + public List Mappers { get; set; } = new List(); } } diff --git a/src/Luban.Job.Common/Source/RawDefs/PEnum.cs b/src/Luban.Job.Common/Source/RawDefs/PEnum.cs index 5c61175..fa85657 100644 --- a/src/Luban.Job.Common/Source/RawDefs/PEnum.cs +++ b/src/Luban.Job.Common/Source/RawDefs/PEnum.cs @@ -30,8 +30,6 @@ namespace Luban.Job.Common.RawDefs public string Tags { get; set; } - public string ExternalType { get; set; } - public List Items { get; set; } = new List(); } } diff --git a/src/Luban.Job.Common/Source/TypeVisitors/RawDefineTypeNameVisitor.cs b/src/Luban.Job.Common/Source/TypeVisitors/RawDefineTypeNameVisitor.cs new file mode 100644 index 0000000..f0ee327 --- /dev/null +++ b/src/Luban.Job.Common/Source/TypeVisitors/RawDefineTypeNameVisitor.cs @@ -0,0 +1,124 @@ +using Luban.Job.Common.Types; + +namespace Luban.Job.Common.TypeVisitors +{ + public class RawDefineTypeNameVisitor : ITypeFuncVisitor + { + public static RawDefineTypeNameVisitor Ins { get; } = new (); + + public string Accept(TBool type) + { + return "bool"; + } + + public string Accept(TByte type) + { + return "byte"; + } + + public string Accept(TShort type) + { + return "short"; + } + + public string Accept(TFshort type) + { + return "fshort"; + } + + public string Accept(TInt type) + { + return "int"; + } + + public string Accept(TFint type) + { + return "fint"; + } + + public string Accept(TLong type) + { + return "long"; + } + + public string Accept(TFlong type) + { + return "flong"; + } + + public string Accept(TFloat type) + { + return "float"; + } + + public string Accept(TDouble type) + { + return "double"; + } + + public string Accept(TEnum type) + { + return type.DefineEnum.FullName; + } + + public string Accept(TString type) + { + return "string"; + } + + public string Accept(TBytes type) + { + return "bytes"; + } + + public string Accept(TText type) + { + return "string"; + } + + public string Accept(TBean type) + { + return type.Bean.FullName; + } + + public string Accept(TArray type) + { + return $"array,{type.ElementType.Apply(this)}"; + } + + public string Accept(TList type) + { + return $"list,{type.ElementType.Apply(this)}"; + } + + public string Accept(TSet type) + { + return $"set,{type.ElementType.Apply(this)}"; + } + + public string Accept(TMap type) + { + return $"map,{type.KeyType.Apply(this)},{type.ValueType.Apply(this)}"; + } + + public string Accept(TVector2 type) + { + return "vector2"; + } + + public string Accept(TVector3 type) + { + return "vector3"; + } + + public string Accept(TVector4 type) + { + return "vector4"; + } + + public virtual string Accept(TDateTime type) + { + return "datetime"; + } + } +} diff --git a/src/Luban.Job.Common/Source/Utils/ExternalTypeUtil.cs b/src/Luban.Job.Common/Source/Utils/ExternalTypeUtil.cs index 66adaaf..f5d5f00 100644 --- a/src/Luban.Job.Common/Source/Utils/ExternalTypeUtil.cs +++ b/src/Luban.Job.Common/Source/Utils/ExternalTypeUtil.cs @@ -1,4 +1,6 @@ using Luban.Job.Common.Defs; +using Luban.Job.Common.RawDefs; +using Luban.Job.Common.Types; using System; using System.Collections.Generic; using System.Linq; @@ -9,22 +11,38 @@ namespace Luban.Job.Common.Utils { public static class ExternalTypeUtil { + + //protected void ResolveExternalType() + //{ + // if (!string.IsNullOrEmpty(_externalTypeName)) + // { + // if (AssemblyBase.TryGetExternalType(_externalTypeName, out var type)) + // { + // this.ExternalType = type; + // } + // else + // { + // throw new Exception($"enum:'{FullName}' 对应的 externaltype:{_externalTypeName} 不存在"); + // } + // } + //} + public static string CsMapperToExternalType(DefTypeBase type) { - var mapper = type.CurrentExternalTypeMapper; - return mapper != null ? mapper.TypeName : type.CsFullName; + var mapper = DefAssemblyBase.LocalAssebmly.GetExternalTypeMapper(type.FullName); + return mapper != null ? mapper.TargetTypeName : type.CsFullName; } public static string CsCloneToExternal(DefTypeBase type, string src) { - var mapper = type.CurrentExternalTypeMapper; + var mapper = DefAssemblyBase.LocalAssebmly.GetExternalTypeMapper(type.FullName); if (mapper == null) { return src; } if (string.IsNullOrWhiteSpace(mapper.CreateExternalObjectFunction)) { - throw new Exception($"type:{type.FullName} externaltype:{type.ExternalType.Name} lan:{mapper.Lan} selector:{mapper.Selector} 未定义clone_to_external元素"); + throw new Exception($"type:{type.FullName} externaltype:{DefAssemblyBase.LocalAssebmly.GetExternalType(type.FullName)} lan:{mapper.Lan} selector:{mapper.Selector} 未定义 create_external_object_function 属性"); } return $"{mapper.CreateExternalObjectFunction}({src})"; }