using CommandLine; using CppAst; namespace refl { [Verb("build",HelpText = "Generate custom code based on the parsed AST.")] internal class CmdBuildOption { [Value(0, MetaName = "", Required = true, Min = 2, HelpText = "Input file(s) for parsing.")] public IEnumerable? InputFiles { get; set; } [Option('o', "output", Required = false, HelpText = "Output file for generated code.")] public string OutputFile { get; set; } = ""; [Option('t', "type", Required = false, HelpText = "Type of code to generate.")] public string CodeType { get; set; } = ""; [Option('l', "link", Required = false, HelpText = "link to the include dir")] public string Link { get; set; } = ""; [Option('d', "define", Required = false, HelpText = "define a macro on the command line")] public string Define { get; set; } = ""; [Option('h', "help", HelpText = "Display this help message.")] public bool Help { get; set; } = false; static CppParserOptions MakeParserOptions(CmdBuildOption opt) { var parse = new CppParserOptions { AdditionalArguments = { "-std=c++20" }, //ParseTokenAttributes = true, //ParseCommentAttribute = true, }; if (!string.IsNullOrWhiteSpace(opt.Define)) { var defines = opt.Define.Split(";"); foreach (var def in defines) { parse.Defines.Add(def); } } if (!string.IsNullOrWhiteSpace(opt.Link)) { var links = opt.Link.Split(";"); foreach (var ink in links) { parse.IncludeFolders.Add(ink); } } return parse; } public static int CMD_CheckBuildOption(CmdBuildOption opt) { if(opt.InputFiles == null) { return -1; } var parse_opt = MakeParserOptions(opt); var compilation = CppAst.CppParser.ParseFiles(opt.InputFiles.Skip(1).ToList(), parse_opt); // Print diagnostic messages foreach (var message in compilation.Diagnostics.Messages) if(message.Type.Equals(CppLogMessageType.Error)) Console.WriteLine(message); var module = ModuleMeta.ParseCompileInfo(compilation); ClassMetaGen.GenNameMeta(); ClassMetaGen.GenCppMeta(module); return 0; } } }