cppast/src/refl/ClassMetaGen.cs
2024-04-21 21:44:53 +08:00

122 lines
4.1 KiB
C#

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<FieldMetaGenData> FieldList = new List<FieldMetaGenData>();
public ClassMetaGenData(string indent, string nameSpace)
{
Indent = indent;
NameSpace = nameSpace;
}
}
internal class ClassMetaGen
{
public static Dictionary<string, StringBuilder> FileList = new Dictionary<string, StringBuilder>();
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<FieldMetaGenData>();
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);
}
}
}
}