From e76b20b24f021d2ec2ea5091cf6c643907ee9261 Mon Sep 17 00:00:00 2001 From: walon Date: Sat, 12 Feb 2022 12:33:08 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E9=87=8D=E6=9E=84=E3=80=91=E9=87=8D?= =?UTF-8?q?=E6=9E=84=20cpp=5Fbin=20=E7=94=9F=E6=88=90=EF=BC=8C=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E5=8F=AF=E4=BB=A5=E5=9C=A8=E6=A8=A1=E6=9D=BF=E4=B8=AD?= =?UTF-8?q?=E5=AE=9A=E5=88=B6=20=E3=80=90=E9=87=8D=E6=9E=84=E3=80=91?= =?UTF-8?q?=E9=87=8D=E6=9E=84=20cpp=5Fue=5Feditor=5Fjson=E3=80=81cpp=5Fue?= =?UTF-8?q?=5Fbp=E3=80=81cs=5Funity=5Feditor=5Fjson=20=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/Generate/CppCodeBinRender.cs | 94 +++---- .../Source/Generate/CppEditorRender.cs | 13 - .../Source/Generate/CppUE4BpRender.cs | 76 +----- .../Source/Generate/CppUE4EditorJsonRender.cs | 241 +----------------- .../Source/Generate/CsUnityEditorRender.cs | 31 +-- .../Generate/FlatBuffersSchemaRender.cs | 6 +- .../Source/Generate/RustCodeJsonRender.cs | 2 +- .../Source/Generate/TemplateCodeRenderBase.cs | 20 +- .../Source/Generate/TemplateConvertRender.cs | 7 +- .../TemplateEditorJsonCodeRenderBase.cs | 44 ++++ .../Source/Defs/DefAssemblyBase.cs | 5 + src/Luban.Server/Luban.Server.csproj | 18 ++ .../Templates/config/cpp_bin/all_types.tpl | 30 +++ .../Templates/config/cpp_bin/bean.tpl | 2 +- .../Templates/config/cpp_bin/stub.tpl | 2 +- .../Templates/config/cpp_ue_bp/bean.tpl | 22 ++ .../Templates/config/cpp_ue_bp/enum.tpl | 19 ++ .../config/cpp_ue_editor_json/bean.tpl | 27 ++ .../config/cpp_ue_editor_json/enum.tpl | 21 ++ .../config/cpp_ue_editor_json/stub.tpl | 97 +++++++ 20 files changed, 363 insertions(+), 414 deletions(-) delete mode 100644 src/Luban.Job.Cfg/Source/Generate/CppEditorRender.cs create mode 100644 src/Luban.Job.Cfg/Source/Generate/TemplateEditorJsonCodeRenderBase.cs create mode 100644 src/Luban.Server/Templates/config/cpp_bin/all_types.tpl create mode 100644 src/Luban.Server/Templates/config/cpp_ue_bp/bean.tpl create mode 100644 src/Luban.Server/Templates/config/cpp_ue_bp/enum.tpl create mode 100644 src/Luban.Server/Templates/config/cpp_ue_editor_json/bean.tpl create mode 100644 src/Luban.Server/Templates/config/cpp_ue_editor_json/enum.tpl create mode 100644 src/Luban.Server/Templates/config/cpp_ue_editor_json/stub.tpl diff --git a/src/Luban.Job.Cfg/Source/Generate/CppCodeBinRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppCodeBinRender.cs index 645c5e7..4dc5311 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CppCodeBinRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CppCodeBinRender.cs @@ -24,94 +24,76 @@ namespace Luban.Job.Cfg.Generate DefAssembly.LocalAssebmly.CurrentLanguage = ELanguage.CPP; ctx.Tasks.Add(Task.Run(() => { - var headerFileContent = new List - { - @$" -#pragma once -#include + var enums = new List(); + var enumCodes = new List(); -#include ""bright/serialization/ByteBuf.h"" -#include ""bright/CfgBean.hpp"" + var beans = new List(); + var beanCodes = new List(); -using ByteBuf = ::bright::serialization::ByteBuf; - -namespace {ctx.TopModule} -{{ -" - }; + var tables = ctx.ExportTables; + var tableCodes = new List(); foreach (var type in ctx.ExportTypes) { - if (type is DefEnum e) + switch(type) { - headerFileContent.Add(Render(e)); - } - } - - foreach (var type in ctx.ExportTypes) - { - if (type is DefBean e) - { - headerFileContent.Add(RenderForwardDefine(e)); - } - } - - foreach (var type in ctx.ExportTypes) - { - if (type is DefBean e) - { - headerFileContent.Add(Render(e)); + case DefEnum e: + { + enums.Add(e); + enumCodes.Add(Render(e)); + break; + } + case DefBean b: + { + beans.Add(b); + beanCodes.Add(Render(b)); + break; + } } } foreach (var type in ctx.ExportTables) { - headerFileContent.Add(Render(type)); + tableCodes.Add(Render(type)); } - headerFileContent.Add(RenderService(ctx.Assembly.TableManagerName, ctx.TopModule, ctx.ExportTables)); + string tablesCode = RenderService(ctx.Assembly.TableManagerName, ctx.TopModule, ctx.ExportTables); - headerFileContent.Add("}"); // end of topmodule - - var content = FileHeaderUtil.ConcatAutoGenerationHeader(string.Join('\n', headerFileContent), ELanguage.CPP); - var file = "gen_types.h"; + var rawContent = GetConfigTemplate("all_types").RenderCode(new + { + Enums = enums, + Beans = beans, + EnumCodes = enumCodes, + BeanCodes = beanCodes, + TableCodes = tableCodes, + TablesCode = tablesCode, + }); + var content = FileHeaderUtil.ConcatAutoGenerationHeader(rawContent, ELanguage.CPP); + var file = ctx.Assembly.GetOptionOr($"{RenderTemplateDir}.output_all_types_file", "gen_types.h"); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content, true); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); var beanTypes = ctx.ExportTypes.Where(c => c is DefBean).ToList(); - int TYPE_PER_STUB_FILE = 100; + int TYPE_PER_STUB_FILE = int.Parse(ctx.Assembly.GetOptionOr($"{RenderTemplateDir}.type_per_stub_file", "100")); + string stubFileFormat = ctx.Assembly.GetOptionOr($"{RenderTemplateDir}.stub_file_name_format", "gen_stub_{0}.cpp"); + var template = GetConfigTemplate("stub"); for (int i = 0, n = (beanTypes.Count + TYPE_PER_STUB_FILE - 1) / TYPE_PER_STUB_FILE; i < n; i++) { int index = i; ctx.Tasks.Add(Task.Run(() => { int startIndex = index * TYPE_PER_STUB_FILE; - var content = FileHeaderUtil.ConcatAutoGenerationHeader( - RenderStub(ctx.TopModule, beanTypes.GetRange(startIndex, Math.Min(TYPE_PER_STUB_FILE, beanTypes.Count - startIndex))), - ELanguage.CPP); - var file = $"gen_stub_{index}.cpp"; + var rawContent = template.RenderCode(new { Types = beanTypes.GetRange(startIndex, Math.Min(TYPE_PER_STUB_FILE, beanTypes.Count - startIndex)), }); + var content = FileHeaderUtil.ConcatAutoGenerationHeader(rawContent, ELanguage.CPP); + var file = string.Format(stubFileFormat, index); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content, true); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } } - private string RenderStub(string topModule, List types) - { - var template = StringTemplateManager.Ins.GetTemplate("config/cpp_bin/stub"); - return template.RenderCode(new { - TopModule = topModule, - Types = types, - }); - } - - private string RenderForwardDefine(DefBean b) - { - return $"{b.CppNamespaceBegin} class {b.Name}; {b.CppNamespaceEnd} "; - } - } } diff --git a/src/Luban.Job.Cfg/Source/Generate/CppEditorRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppEditorRender.cs deleted file mode 100644 index b781d65..0000000 --- a/src/Luban.Job.Cfg/Source/Generate/CppEditorRender.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Luban.Job.Cfg.Defs; -using Luban.Job.Common.Defs; -using Luban.Job.Common.Generate; -using System.Collections.Generic; - -namespace Luban.Job.Cfg.Generate -{ - [Render("code_cpp_editor")] - class CppEditorRender : TemplateCodeRenderBase - { - protected override string RenderTemplateDir => "cpp_editor_json"; - } -} diff --git a/src/Luban.Job.Cfg/Source/Generate/CppUE4BpRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppUE4BpRender.cs index f4c68d3..f8798b3 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CppUE4BpRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CppUE4BpRender.cs @@ -12,8 +12,9 @@ using System.Threading.Tasks; namespace Luban.Job.Cfg.Generate { [Render("code_cpp_ue_bp")] - class CppUE4BpRender : CodeRenderBase + class CppUE4BpRender : TemplateCodeRenderBase { + protected override string RenderTemplateDir => "cpp_ue_bp"; public override void Render(GenContext ctx) { @@ -34,82 +35,11 @@ namespace Luban.Job.Cfg.Generate } } - [ThreadStatic] - private static Template t_enumRender; public override string Render(DefEnum e) { - // ue 不允许 UEnum 为这 - // ue 强制枚举underling type 为 uint8, 意味着不能超过255 - var template = t_enumRender ??= Template.Parse(@" -#pragma once -#include ""CoreMinimal.h"" - -#include ""{{ue_bp_header_file_name_without_suffix}}.generated.h"" - -UENUM(BlueprintType) -enum class {{ue_bp_full_name}} : uint8 -{ - {{~if !contains_value_equal0_item~}} - __DEFAULT__ = 0, - {{~end~}} - {{~if contains_any_ue_enum_compatible_item~}} - {{~for item in items ~}} - {{if item.int_value >= 256}}//{{end}}{{item.name}} = {{item.value}} UMETA(DisplayName = ""{{item.alias_or_name}}""), - {{~end~}} - {{~else~}} - DUMMY UMETA(DisplayName = ""DUMMY""), - {{~end~}} -}; - -"); + var template = GetConfigTemplate("enum"); var result = template.Render(e); - return result; } - - [ThreadStatic] - private static Template t_beanRender; - public override string Render(DefBean b) - { - var template = t_beanRender ??= Template.Parse(@" -#pragma once -#include ""CoreMinimal.h"" -#include ""UCfgObj.h"" - - -{{ue_bp_includes}} - -#include ""{{ue_bp_header_file_name_without_suffix}}.generated.h"" - -UCLASS(BlueprintType) -class X6PROTO_API {{ue_bp_full_name}} : public {{if parent_def_type}} {{parent_def_type.ue_bp_full_name}} {{else}} UCfgObj {{end}} -{ - GENERATED_BODY() - -public: - - - {{~for field in export_fields ~}} - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (DisplayName = ""{{field.name}}"")) - {{field.ctype.ue_bp_cpp_define_type}} {{field.name}}; - {{~end~}} -}; - - -"); - var result = template.Render(b); - - return result; - } - - public override string Render(DefTable c) - { - throw new NotImplementedException(); - } - - public override string RenderService(string name, string module, List tables) - { - throw new NotImplementedException(); - } } } diff --git a/src/Luban.Job.Cfg/Source/Generate/CppUE4EditorJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppUE4EditorJsonRender.cs index 19cb755..3610636 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CppUE4EditorJsonRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CppUE4EditorJsonRender.cs @@ -3,6 +3,7 @@ using Luban.Job.Cfg.Defs; using Luban.Job.Common; using Luban.Job.Common.Defs; using Luban.Job.Common.Generate; +using Luban.Job.Common.Tpl; using Luban.Job.Common.Utils; using Scriban; using System; @@ -13,8 +14,10 @@ using System.Threading.Tasks; namespace Luban.Job.Cfg.Generate { [Render("code_cpp_ue_editor_json")] - class CppUE4EditorJsonRender : CodeRenderBase + class CppUE4EditorJsonRender : TemplateEditorJsonCodeRenderBase { + protected override string RenderTemplateDir => "cpp_ue_editor_json"; + public override void Render(GenContext ctx) { var render = new CppUE4EditorJsonRender(); @@ -26,250 +29,28 @@ namespace Luban.Job.Cfg.Generate ctx.Tasks.Add(Task.Run(() => { var content = FileHeaderUtil.ConcatAutoGenerationHeader(render.RenderAny(c), ELanguage.CPP); - var file = "editor_" + RenderFileUtil.GetUeCppDefTypeHeaderFilePath(c.FullName); + var file = RenderFileUtil.GetUeCppDefTypeHeaderFilePath(c.FullName); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content, true); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } - int TYPE_PER_STUB_FILE = 200; - + int TYPE_PER_STUB_FILE = int.Parse(ctx.Assembly.GetOptionOr($"{RenderTemplateDir}.type_per_stub_file", "200")); + string stubFileFormat = ctx.Assembly.GetOptionOr($"{RenderTemplateDir}.stub_file_name_format", "gen_stub_{0}.cpp"); + var template = GetConfigTemplate("stub"); for (int i = 0, n = (renderTypes.Count + TYPE_PER_STUB_FILE - 1) / TYPE_PER_STUB_FILE; i < n; i++) { int index = i; ctx.Tasks.Add(Task.Run(() => { int startIndex = index * TYPE_PER_STUB_FILE; - var content = FileHeaderUtil.ConcatAutoGenerationHeader( - render.RenderStub(renderTypes.GetRange(startIndex, Math.Min(TYPE_PER_STUB_FILE, renderTypes.Count - startIndex))), - ELanguage.CPP); - var file = $"stub_{index}.cpp"; + var rawContent = template.RenderCode(new { Types = renderTypes.GetRange(startIndex, Math.Min(TYPE_PER_STUB_FILE, renderTypes.Count - startIndex)), }); + var content = FileHeaderUtil.ConcatAutoGenerationHeader(rawContent, ELanguage.CPP); + var file = string.Format(stubFileFormat, index); var md5 = CacheFileUtil.GenMd5AndAddCache(file, content, true); ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); })); } } - - - [ThreadStatic] - private static Template t_enumRender; - public override string Render(DefEnum e) - { - var template = t_enumRender ??= Template.Parse(@" -#pragma once -#include ""CoreMinimal.h"" - -namespace editor -{ - -{{cpp_namespace_begin}} - - enum class {{ue_fname}} - { - {{~for item in items ~}} - {{item.name}} = {{item.value}}, - {{~end~}} - }; - - bool X6PROTOEDITOR_API {{ue_fname}}ToString({{ue_fname}} value, FString& s); - bool X6PROTOEDITOR_API {{ue_fname}}FromString(const FString& s, {{ue_fname}}& x); - -{{cpp_namespace_end}} - -} -"); - var result = template.Render(e); - - return result; - } - - [ThreadStatic] - private static Template t_beanRender; - public override string Render(DefBean b) - { - var template = t_beanRender ??= Template.Parse(@" -#pragma once -#include ""CoreMinimal.h"" -#include ""FCfgObj.h"" - -{{editor_cpp_includes}} - -namespace editor -{ - -{{cpp_namespace_begin}} - -struct X6PROTOEDITOR_API {{ue_fname}} : public {{if parent_def_type}} {{parent_def_type.ue_fname}}{{else}}FCfgObj{{end}} -{ - {{~for field in fields ~}} - {{field.ctype.editor_ue_cpp_define_type}} {{field.name}}; - {{~end~}} - -{{~if !is_abstract_type~}} - bool Load(FJsonObject* _json) override; - bool Save(FJsonObject*& result) override; -{{~end~}} - - static bool Create(FJsonObject* _json, {{ue_fname}}*& result); -}; - - -{{cpp_namespace_end}} - -} - -"); - var result = template.Render(b); - - return result; - } - - - private class Stub - { - public List Types { get; set; } - - public string Includes - { - get - { - var includeTypes = new HashSet(Types); - - foreach (var type in Types) - { - if (type is DefBean bean) - { - foreach (DefBean c in bean.HierarchyNotAbstractChildren) - { - includeTypes.Add(c); - } - } - } - //return string.Join('\n', includeTypes.Select(im => $"#include \"{ im.UeEditorHeaderFileName}\"")); - throw new NotImplementedException(); - } - } - } - - [ThreadStatic] - private static Template t_stubRender; - public string RenderStub(List types) - { - var template = t_stubRender ??= Template.Parse(@" -#include ""JsonUtil.h"" - -{{includes}} - -namespace editor -{ - -{{~for type in types~}} -{{type.cpp_namespace_begin}} -{{~if type.is_bean~}} -{{~if type.is_abstract_type~}} - bool {{type.ue_fname}}::Create(FJsonObject* _json, {{type.ue_fname}}*& result) - { - FString type; - if (_json->TryGetStringField(FString(""{{type.json_type_name_key}}""), type)) - { - {{~for child in type.hierarchy_not_abstract_children~}} - if (type == ""{{cs_impl_data_type child x}}"") - { - result = new {{child.ue_fname}}(); - } else - {{~end~}} - { - result = nullptr; - return false; - } - if (!result->Load(_json)) - { - delete result; - return false; - } - return true; - } - else - { - result = nullptr; - return false; - } - } -{{~else~}} - bool {{type.ue_fname}}::Create(FJsonObject* _json, {{type.ue_fname}}*& result) - { - result = new {{type.ue_fname}}(); - if (!result->Load(_json)) - { - delete result; - return false; - } - return true; - } - - - bool {{type.ue_fname}}::Save(FJsonObject*& result) - { - auto _json = new FJsonObject(); - _json->SetStringField(""{{type.json_type_name_key}}"", ""{{type.name}}""); - -{{~for field in type.hierarchy_fields~}} - {{field.editor_ue_cpp_save}} -{{~end~}} - result = _json; - return true; - } - - bool {{type.ue_fname}}::Load(FJsonObject* _json) - { -{{~for field in type.hierarchy_fields~}} - {{field.editor_ue_cpp_load}} -{{~end~}} - return true; - } -{{~end~}} -{{~else~}} - -bool {{type.ue_fname}}ToString({{type.ue_fname}} value, FString& s) -{ - {{~for item in type.items ~}} - if (value == {{type.ue_fname}}::{{item.name}}) { s = ""{{item.name}}""; return true; } - {{~end~}} - return false; -} -bool {{type.ue_fname}}FromString(const FString& s, {{type.ue_fname}}& value) -{ - {{~for item in type.items ~}} - if (s == ""{{item.name}}"") - { - value = {{type.ue_fname}}::{{item.name}}; - return true; - } - {{~end~}} - return false; -} - -{{~end~}} -{{type.cpp_namespace_end}} -{{~end~}} -} -"); - var result = template.Render(new Stub - { - Types = types, - }); - - return result; - } - - public override string Render(DefTable c) - { - throw new NotImplementedException(); - } - - public override string RenderService(string name, string module, List tables) - { - throw new NotImplementedException(); - } } } diff --git a/src/Luban.Job.Cfg/Source/Generate/CsUnityEditorRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsUnityEditorRender.cs index d178f16..be6e264 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CsUnityEditorRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CsUnityEditorRender.cs @@ -11,37 +11,8 @@ using System.Threading.Tasks; namespace Luban.Job.Cfg.Generate { [Render("code_cs_unity_editor_json")] - class CsUnityEditorRender : TemplateCodeRenderBase + class CsUnityEditorRender : TemplateEditorJsonCodeRenderBase { override protected string RenderTemplateDir => "cs_unity_editor_json"; - - - public override string Render(DefEnum e) - { - var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/enum"); - var result = template.RenderCode(e); - return result; - } - - public override void Render(GenContext ctx) - { - ctx.Assembly.CurrentLanguage = ELanguage.CS; - foreach (var c in ctx.Assembly.Types.Values) - { - if (!(c is DefBean) && !(c is DefEnum)) - { - continue; - } - ctx.Tasks.Add(Task.Run(() => - { - var content = FileHeaderUtil.ConcatAutoGenerationHeader(RenderAny(c), ELanguage.CS); - var file = RenderFileUtil.GetDefTypePath(c.FullName, ELanguage.CS); - var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); - ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); - })); - } - } - - } } diff --git a/src/Luban.Job.Cfg/Source/Generate/FlatBuffersSchemaRender.cs b/src/Luban.Job.Cfg/Source/Generate/FlatBuffersSchemaRender.cs index 096e920..2ebd5b4 100644 --- a/src/Luban.Job.Cfg/Source/Generate/FlatBuffersSchemaRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/FlatBuffersSchemaRender.cs @@ -46,7 +46,7 @@ namespace Luban.Job.Cfg.Generate private string RenderConvertJson2BinaryBat(string name, string module, List tables) { - var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/convert_json_to_binary_bat"); + var template = GetConfigTemplate("convert_json_to_binary_bat"); var result = template.RenderCode(new { Name = name, Namespace = module, @@ -57,7 +57,7 @@ namespace Luban.Job.Cfg.Generate private string RenderConvertJson2BinarySh(string name, string module, List tables) { - var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/convert_json_to_binary_sh"); + var template = GetConfigTemplate("convert_json_to_binary_sh"); var result = template.RenderCode(new { Name = name, Namespace = module, @@ -92,7 +92,7 @@ namespace Luban.Job.Cfg.Generate // 所以排到前面生成 beans.Sort((a, b) => (a.IsAbstractType ? 0 : 1) - (b.IsAbstractType ? 0 : 1)); - var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/all"); + var template = GetConfigTemplate("all"); var result = template.RenderCode(new { Namespace = ass.TopModule, Enums = enums.Select(e => Render((DefEnum)e)).ToList(), diff --git a/src/Luban.Job.Cfg/Source/Generate/RustCodeJsonRender.cs b/src/Luban.Job.Cfg/Source/Generate/RustCodeJsonRender.cs index ac5d32d..db24da6 100644 --- a/src/Luban.Job.Cfg/Source/Generate/RustCodeJsonRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/RustCodeJsonRender.cs @@ -30,7 +30,7 @@ namespace Luban.Job.Cfg.Generate lines, ls => { - var template = StringTemplateManager.Ins.GetTemplate("config/rust_json/include"); + var template = GetConfigTemplate("include"); var result = template.RenderCode(ctx.ExportTypes); ls.Add(result); }, null); diff --git a/src/Luban.Job.Cfg/Source/Generate/TemplateCodeRenderBase.cs b/src/Luban.Job.Cfg/Source/Generate/TemplateCodeRenderBase.cs index be63bb3..4370758 100644 --- a/src/Luban.Job.Cfg/Source/Generate/TemplateCodeRenderBase.cs +++ b/src/Luban.Job.Cfg/Source/Generate/TemplateCodeRenderBase.cs @@ -16,6 +16,16 @@ namespace Luban.Job.Cfg.Generate protected abstract string RenderTemplateDir { get; } + protected Scriban.Template GetConfigTemplate(string name) + { + return StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/{name}"); + } + + protected Scriban.Template GetCommonTemplate(string name) + { + return StringTemplateManager.Ins.GetTemplate($"common/{CommonRenderTemplateDir}/{name}"); + } + public override void Render(GenContext ctx) { GenerateCodeScatter(ctx); @@ -23,7 +33,7 @@ namespace Luban.Job.Cfg.Generate public override string Render(DefEnum e) { - var template = StringTemplateManager.Ins.GetTemplate($"common/{CommonRenderTemplateDir}/enum"); + var template = GetCommonTemplate("enum"); var result = template.RenderCode(e); return result; @@ -31,21 +41,21 @@ namespace Luban.Job.Cfg.Generate public override string Render(DefBean b) { - var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/bean"); + var template = GetConfigTemplate("bean"); var result = template.RenderCode(b); return result; } public override string Render(DefTable p) { - var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/table"); + var template = GetConfigTemplate("table"); var result = template.RenderCode(p); return result; } public override string RenderService(string name, string module, List tables) { - var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/tables"); + var template = GetConfigTemplate("tables"); var result = template.RenderCode(new { Name = name, Namespace = module, @@ -60,7 +70,7 @@ namespace Luban.Job.Cfg.Generate var beans = types.Where(t => t is DefBean).ToList(); var tables = types.Where(t => t is DefTable).ToList(); - var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/all"); + var template = GetConfigTemplate("all"); var result = template.RenderCode(new { Namespace = DefAssembly.LocalAssebmly.TopModule, Enums = enums.Select(e => Render((DefEnum)e)).ToList(), diff --git a/src/Luban.Job.Cfg/Source/Generate/TemplateConvertRender.cs b/src/Luban.Job.Cfg/Source/Generate/TemplateConvertRender.cs index 3b9e13f..30c52d1 100644 --- a/src/Luban.Job.Cfg/Source/Generate/TemplateConvertRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/TemplateConvertRender.cs @@ -17,11 +17,16 @@ namespace Luban.Job.Cfg.Generate [Render("convert_template")] class TemplateConvertRender : DataRenderBase { + protected Template GetConvertTemplate(string name) + { + return StringTemplateManager.Ins.GetTemplate($"config/convert/{name}"); + } + public override void Render(GenContext ctx) { string genType = ctx.GenType; - Template template = StringTemplateManager.Ins.GetTemplate($"config/convert/{ctx.GenArgs.TemplateConvertFile}"); + Template template = GetConvertTemplate(ctx.GenArgs.TemplateConvertFile); foreach (var table in ctx.ExportTables) { diff --git a/src/Luban.Job.Cfg/Source/Generate/TemplateEditorJsonCodeRenderBase.cs b/src/Luban.Job.Cfg/Source/Generate/TemplateEditorJsonCodeRenderBase.cs new file mode 100644 index 0000000..89fc0da --- /dev/null +++ b/src/Luban.Job.Cfg/Source/Generate/TemplateEditorJsonCodeRenderBase.cs @@ -0,0 +1,44 @@ +using Luban.Common.Protos; +using Luban.Job.Cfg.Defs; +using Luban.Job.Common; +using Luban.Job.Common.Defs; +using Luban.Job.Common.Tpl; +using Luban.Job.Common.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Luban.Job.Cfg.Generate +{ + abstract class TemplateEditorJsonCodeRenderBase :TemplateCodeRenderBase + { + public override string Render(DefEnum e) + { + var template = GetConfigTemplate("enum"); + var result = template.RenderCode(e); + return result; + } + + public override void Render(GenContext ctx) + { + ELanguage lan = GetLanguage(ctx); + ctx.Assembly.CurrentLanguage = lan; + foreach (var c in ctx.Assembly.Types.Values) + { + if (c is not DefBean && c is not DefEnum) + { + continue; + } + ctx.Tasks.Add(Task.Run(() => + { + var content = FileHeaderUtil.ConcatAutoGenerationHeader(RenderAny(c), lan); + var file = RenderFileUtil.GetDefTypePath(c.FullName, lan); + var md5 = CacheFileUtil.GenMd5AndAddCache(file, content); + ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 }); + })); + } + } + } +} diff --git a/src/Luban.Job.Common/Source/Defs/DefAssemblyBase.cs b/src/Luban.Job.Common/Source/Defs/DefAssemblyBase.cs index 434f5f7..bbacac9 100644 --- a/src/Luban.Job.Common/Source/Defs/DefAssemblyBase.cs +++ b/src/Luban.Job.Common/Source/Defs/DefAssemblyBase.cs @@ -80,6 +80,11 @@ namespace Luban.Job.Common.Defs return Options.TryGetValue(optionName, out var value) ? value : null; } + public string GetOptionOr(string optionName, string defaultValue) + { + return Options.TryGetValue(optionName, out var value) ? value : defaultValue; + } + private void SetCurrentExternalSelectors(string selectors) { if (string.IsNullOrEmpty(selectors)) diff --git a/src/Luban.Server/Luban.Server.csproj b/src/Luban.Server/Luban.Server.csproj index 381fb8f..e3d714a 100644 --- a/src/Luban.Server/Luban.Server.csproj +++ b/src/Luban.Server/Luban.Server.csproj @@ -79,6 +79,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -91,6 +94,21 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/src/Luban.Server/Templates/config/cpp_bin/all_types.tpl b/src/Luban.Server/Templates/config/cpp_bin/all_types.tpl new file mode 100644 index 0000000..4a90b2b --- /dev/null +++ b/src/Luban.Server/Templates/config/cpp_bin/all_types.tpl @@ -0,0 +1,30 @@ +#pragma once +#include + +#include "bright/serialization/ByteBuf.h" +#include "bright/CfgBean.hpp" + +using ByteBuf = ::bright::serialization::ByteBuf; + +namespace {{assembly.top_module}} +{ + +{{~for e in x.enum_codes~}} +{{e}} +{{~end~}} + +{{~for b in x.beans~}} +{{b.cpp_namespace_begin}} class {{b.name}}; {{b.cpp_namespace_end}} +{{~end~}} + +{{~for b in x.bean_codes~}} +{{b}} +{{~end~}} + +{{~for t in x.table_codes~}} +{{t}} +{{~end~}} + +{{x.tables_code}} + +} diff --git a/src/Luban.Server/Templates/config/cpp_bin/bean.tpl b/src/Luban.Server/Templates/config/cpp_bin/bean.tpl index b207208..f4c4927 100644 --- a/src/Luban.Server/Templates/config/cpp_bin/bean.tpl +++ b/src/Luban.Server/Templates/config/cpp_bin/bean.tpl @@ -63,4 +63,4 @@ class {{name}} : public {{if parent_def_type}} {{parent_def_type.cpp_full_name}} virtual void resolve(::bright::HashMap<::bright::String, void*>& _tables); }; -{{x.cpp_namespace_end}} \ No newline at end of file +{{x.cpp_namespace_end}} diff --git a/src/Luban.Server/Templates/config/cpp_bin/stub.tpl b/src/Luban.Server/Templates/config/cpp_bin/stub.tpl index 859140e..e417140 100644 --- a/src/Luban.Server/Templates/config/cpp_bin/stub.tpl +++ b/src/Luban.Server/Templates/config/cpp_bin/stub.tpl @@ -3,7 +3,7 @@ using ByteBuf = bright::serialization::ByteBuf; -namespace {{x.top_module}} +namespace {{assembly.top_module}} { {{~for type in x.types~}} diff --git a/src/Luban.Server/Templates/config/cpp_ue_bp/bean.tpl b/src/Luban.Server/Templates/config/cpp_ue_bp/bean.tpl new file mode 100644 index 0000000..eb7c748 --- /dev/null +++ b/src/Luban.Server/Templates/config/cpp_ue_bp/bean.tpl @@ -0,0 +1,22 @@ +#pragma once +#include ""CoreMinimal.h"" +#include ""UCfgObj.h"" + + +{{ue_bp_includes}} + +#include ""{{ue_bp_header_file_name_without_suffix}}.generated.h"" + +UCLASS(BlueprintType) +class X6PROTO_API {{ue_bp_full_name}} : public {{if parent_def_type}} {{parent_def_type.ue_bp_full_name}} {{else}} UCfgObj {{end}} +{ + GENERATED_BODY() + +public: + + + {{~for field in export_fields ~}} + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (DisplayName = ""{{field.name}}"")) + {{field.ctype.ue_bp_cpp_define_type}} {{field.name}}; + {{~end~}} +}; diff --git a/src/Luban.Server/Templates/config/cpp_ue_bp/enum.tpl b/src/Luban.Server/Templates/config/cpp_ue_bp/enum.tpl new file mode 100644 index 0000000..8cb0449 --- /dev/null +++ b/src/Luban.Server/Templates/config/cpp_ue_bp/enum.tpl @@ -0,0 +1,19 @@ +#pragma once +#include ""CoreMinimal.h"" + +#include ""{{ue_bp_header_file_name_without_suffix}}.generated.h"" + +UENUM(BlueprintType) +enum class {{ue_bp_full_name}} : uint8 +{ + {{~if !contains_value_equal0_item~}} + __DEFAULT__ = 0, + {{~end~}} + {{~if contains_any_ue_enum_compatible_item~}} + {{~for item in items ~}} + {{if item.int_value >= 256}}//{{end}}{{item.name}} = {{item.value}} UMETA(DisplayName = ""{{item.alias_or_name}}""), + {{~end~}} + {{~else~}} + DUMMY UMETA(DisplayName = ""DUMMY""), + {{~end~}} +}; diff --git a/src/Luban.Server/Templates/config/cpp_ue_editor_json/bean.tpl b/src/Luban.Server/Templates/config/cpp_ue_editor_json/bean.tpl new file mode 100644 index 0000000..b8ffc4c --- /dev/null +++ b/src/Luban.Server/Templates/config/cpp_ue_editor_json/bean.tpl @@ -0,0 +1,27 @@ +#pragma once +#include ""CoreMinimal.h"" +#include ""FCfgObj.h"" + +{{editor_cpp_includes}} + +namespace editor +{ + +{{cpp_namespace_begin}} + +struct X6PROTOEDITOR_API {{ue_fname}} : public {{if parent_def_type}} {{parent_def_type.ue_fname}}{{else}}FCfgObj{{end}} +{ + {{~for field in fields ~}} + {{field.ctype.editor_ue_cpp_define_type}} {{field.name}}; + {{~end~}} + +{{~if !is_abstract_type~}} + bool Load(FJsonObject* _json) override; + bool Save(FJsonObject*& result) override; +{{~end~}} + + static bool Create(FJsonObject* _json, {{ue_fname}}*& result); +}; + + +{{cpp_namespace_end}} \ No newline at end of file diff --git a/src/Luban.Server/Templates/config/cpp_ue_editor_json/enum.tpl b/src/Luban.Server/Templates/config/cpp_ue_editor_json/enum.tpl new file mode 100644 index 0000000..610cad2 --- /dev/null +++ b/src/Luban.Server/Templates/config/cpp_ue_editor_json/enum.tpl @@ -0,0 +1,21 @@ +#pragma once +#include ""CoreMinimal.h"" + +namespace editor +{ + +{{cpp_namespace_begin}} + + enum class {{ue_fname}} + { + {{~for item in items ~}} + {{item.name}} = {{item.value}}, + {{~end~}} + }; + + bool X6PROTOEDITOR_API {{ue_fname}}ToString({{ue_fname}} value, FString& s); + bool X6PROTOEDITOR_API {{ue_fname}}FromString(const FString& s, {{ue_fname}}& x); + +{{cpp_namespace_end}} + +} \ No newline at end of file diff --git a/src/Luban.Server/Templates/config/cpp_ue_editor_json/stub.tpl b/src/Luban.Server/Templates/config/cpp_ue_editor_json/stub.tpl new file mode 100644 index 0000000..3b27fe6 --- /dev/null +++ b/src/Luban.Server/Templates/config/cpp_ue_editor_json/stub.tpl @@ -0,0 +1,97 @@ +#include ""JsonUtil.h"" + +{{includes}} + +namespace editor +{ + +{{~for type in types~}} +{{type.cpp_namespace_begin}} +{{~if type.is_bean~}} +{{~if type.is_abstract_type~}} + bool {{type.ue_fname}}::Create(FJsonObject* _json, {{type.ue_fname}}*& result) + { + FString type; + if (_json->TryGetStringField(FString(""{{type.json_type_name_key}}""), type)) + { + {{~for child in type.hierarchy_not_abstract_children~}} + if (type == ""{{cs_impl_data_type child x}}"") + { + result = new {{child.ue_fname}}(); + } else + {{~end~}} + { + result = nullptr; + return false; + } + if (!result->Load(_json)) + { + delete result; + return false; + } + return true; + } + else + { + result = nullptr; + return false; + } + } +{{~else~}} + bool {{type.ue_fname}}::Create(FJsonObject* _json, {{type.ue_fname}}*& result) + { + result = new {{type.ue_fname}}(); + if (!result->Load(_json)) + { + delete result; + return false; + } + return true; + } + + + bool {{type.ue_fname}}::Save(FJsonObject*& result) + { + auto _json = new FJsonObject(); + _json->SetStringField(""{{type.json_type_name_key}}"", ""{{type.name}}""); + +{{~for field in type.hierarchy_fields~}} + {{field.editor_ue_cpp_save}} +{{~end~}} + result = _json; + return true; + } + + bool {{type.ue_fname}}::Load(FJsonObject* _json) + { +{{~for field in type.hierarchy_fields~}} + {{field.editor_ue_cpp_load}} +{{~end~}} + return true; + } +{{~end~}} +{{~else~}} + +bool {{type.ue_fname}}ToString({{type.ue_fname}} value, FString& s) +{ + {{~for item in type.items ~}} + if (value == {{type.ue_fname}}::{{item.name}}) { s = ""{{item.name}}""; return true; } + {{~end~}} + return false; +} +bool {{type.ue_fname}}FromString(const FString& s, {{type.ue_fname}}& value) +{ + {{~for item in type.items ~}} + if (s == ""{{item.name}}"") + { + value = {{type.ue_fname}}::{{item.name}}; + return true; + } + {{~end~}} + return false; +} + +{{~end~}} +{{type.cpp_namespace_end}} +{{~end~}} +} \ No newline at end of file