luban/src/Luban.Job.Cfg/Source/Generate/FlatBuffersSchemaRender.cs

107 lines
4.3 KiB
C#

using Luban.Common.Protos;
using Luban.Job.Cfg.Defs;
using Luban.Job.Common.Defs;
using Luban.Job.Common.Generate;
using Luban.Job.Common.Tpl;
using Luban.Job.Common.TypeVisitors;
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
{
[Render("code_flatbuffers")]
class FlatBuffersSchemaRender : TemplateCodeRenderBase
{
protected override string RenderTemplateDir => "flatbuffers";
public override void Render(GenContext ctx)
{
{
DefAssembly.LocalAssebmly.CurrentLanguage = Common.ELanguage.FLATBUFFERS;
var file = RenderFileUtil.GetFileOrDefault(ctx.GenArgs.OutputCodeMonolithicFile, "schema.fbs");
var content = this.RenderAll(ctx.ExportTypes);
var md5 = CacheFileUtil.GenMd5AndAddCache(file, string.Join('\n', content));
ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 });
}
{
DefAssembly.LocalAssebmly.CurrentLanguage = Common.ELanguage.FLATBUFFERS;
var file = "convert_json_to_binary.bat";
var content = this.RenderConvertJson2BinaryBat(ctx.Assembly.TableManagerName, ctx.TopModule, ctx.ExportTables);
var md5 = CacheFileUtil.GenMd5AndAddCache(file, string.Join('\n', content));
ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 });
}
{
DefAssembly.LocalAssebmly.CurrentLanguage = Common.ELanguage.FLATBUFFERS;
var file = "convert_json_to_binary.sh";
var content = this.RenderConvertJson2BinarySh(ctx.Assembly.TableManagerName, ctx.TopModule, ctx.ExportTables);
var md5 = CacheFileUtil.GenMd5AndAddCache(file, string.Join('\n', content));
ctx.GenCodeFilesInOutputCodeDir.Add(new FileInfo() { FilePath = file, MD5 = md5 });
}
}
private string RenderConvertJson2BinaryBat(string name, string module, List<DefTable> tables)
{
var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/convert_json_to_binary_bat");
var result = template.RenderCode(new {
Name = name,
Namespace = module,
Tables = tables,
});
return result;
}
private string RenderConvertJson2BinarySh(string name, string module, List<DefTable> tables)
{
var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/convert_json_to_binary_sh");
var result = template.RenderCode(new {
Name = name,
Namespace = module,
Tables = tables,
});
return result;
}
private MapKeyValueEntryCollection CollectKeyValueEntry(List<DefBean> beans)
{
var c = new MapKeyValueEntryCollection();
foreach (DefBean bean in beans)
{
CollectMapKeyValueEntrysVisitor.Ins.Accept(bean, c);
}
return c;
}
public override string RenderAll(List<DefTypeBase> types)
{
var ass = DefAssembly.LocalAssebmly;
var enums = types.Where(t => t is DefEnum).ToList();
var beans = types.Where(t => t is DefBean).Cast<DefBean>().ToList();
var tables = types.Where(t => t is DefTable).ToList();
var maps = CollectKeyValueEntry(beans).KeyValueEntries.Values;
// 多态在flatbuffers中为union类型。
// flatbuffers要求union必须在使用前定义
// 所以排到前面生成
beans.Sort((a, b) => (a.IsAbstractType ? 0 : 1) - (b.IsAbstractType ? 0 : 1));
var template = StringTemplateManager.Ins.GetTemplate($"config/{RenderTemplateDir}/all");
var result = template.RenderCode(new {
Namespace = ass.TopModule,
Enums = enums.Select(e => Render((DefEnum)e)).ToList(),
Beans = beans.Select(b => Render(b)).ToList(),
Tables = tables.Select(t => Render((DefTable)t)).ToList(),
Maps = maps,
});
return result;
}
}
}