122 lines
4.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|