using System.Text; using Fluid; namespace refl { internal class FieldMetaGenData { public string Name { get; set; } public string Meta { get; set; } public bool IsMethod { get; set; } public FieldMetaGenData(string name, string meta, bool isMethod) { Name = name; Meta = meta; IsMethod = isMethod; } } internal class ClassMetaGenData { public string Name { get; set; } = ""; public string NameSpace { get; set; } = ""; public string ParentName { get; set; } = ""; public string Indent { get; set; } = ""; public string MetaName { get; set; } = ""; public List FieldList = new List(); public ClassMetaGenData(string indent, string nameSpace) { Indent = indent; NameSpace = nameSpace; } } internal class ClassMetaGen { public static Dictionary FileList = new Dictionary(); public static Fluid.IFluidTemplate? GenTemplate; public static TemplateOptions GenOptions = new TemplateOptions(); public static void GenNameMeta() { foreach (var pair in ModuleMeta.NameMaps) { var build = new StringBuilder(); build.Append("namespace "); build.Append(pair.Key); build.Append("_Name {\n"); foreach(var kv in pair.Value) { build.Append(" constexpr const Name "); build.Append(kv); build.Append("=\""); build.Append(kv); build.Append("\";\n"); } build.Append("}\n"); Console.WriteLine(build.ToString()); build.Clear(); FileList.Add(pair.Key, build); } } public static void GenCppMeta(ModuleMeta module) { var template_string = File.ReadAllText("template/refl.liquid"); var parser = new FluidParser(); parser.TryParse(template_string, out GenTemplate, out var error); GenOptions.MemberAccessStrategy.Register(); if (!string.IsNullOrEmpty(error)) { Console.WriteLine(error); return; } GenModuleMeta(module, null); foreach (var pair in FileList) { Console.WriteLine(pair.Key); Console.WriteLine(pair.Value.ToString()); } } public static void GenModuleMeta(ModuleMeta module, string? prefix) { var gen = new ClassMetaGenData(prefix+"", module.NameSpace); foreach (var cls in module.ClassList) { GenClassMeta(cls, gen); } foreach (var child in module.ChildList) { if(prefix == null) { GenModuleMeta(child, prefix + "\r"); } else { GenModuleMeta(child, prefix + "\t"); } } } public static void GenClassMeta(ClassMeta cls, ClassMetaGenData gen) { gen.Name = cls.Name; gen.ParentName = cls.ParentName; foreach (var pair in cls.Fields) { gen.FieldList.Clear(); foreach (var field in pair.Value.MemberList) { gen.FieldList.Add(new FieldMetaGenData(field.Name, field.Meta, false)); } foreach (var field in pair.Value.MethodList) { gen.FieldList.Add(new FieldMetaGenData(field.Name, field.Meta, true)); } gen.MetaName = pair.Key; var context = new TemplateContext(gen, GenOptions); var res = GenTemplate.Render(context); FileList[pair.Key].Append(res); } } } }