update test_ast file

This commit is contained in:
csh
2025-10-25 23:53:04 +08:00
parent e0e8c7b26d
commit 6aa28f9b23
3 changed files with 1218 additions and 848 deletions
+69 -35
View File
@@ -105,12 +105,23 @@ void PrintUsage(const char* program_name)
{
std::cout << "Usage: " << program_name << " <file_path> [options]\n";
std::cout << "\nOptions:\n";
std::cout << " -v, --verbose Print verbose output\n";
std::cout << " -i, --incremental Test incremental parsing\n";
std::cout << " -h, --help Show this help message\n";
std::cout << "\nExample:\n";
std::cout << " -v, --verbose Show verbose output with source code\n";
std::cout << " -c, --compact Use compact output mode\n";
std::cout << " -s, --show-source Show source code snippets (default: off)\n";
std::cout << " -l, --hide-location Hide location information\n";
std::cout << " -n, --no-colors Disable colored output\n";
std::cout << " -t, --no-tree Disable tree characters\n";
std::cout << " -k, --show-kind Show node kind enums\n";
std::cout << " -i, --incremental Test incremental parsing\n";
std::cout << " -h, --help Show this help message\n";
std::cout << "\nPreset Modes:\n";
std::cout << " --verbose Equivalent to: -s -k\n";
std::cout << " --compact Equivalent to: -c -l -t\n";
std::cout << "\nExamples:\n";
std::cout << " " << program_name << " test.tsf\n";
std::cout << " " << program_name << " test.tsf -v -s\n";
std::cout << " " << program_name << " test.tsf --verbose\n";
std::cout << " " << program_name << " test.tsf --compact\n";
std::cout << " " << program_name << " test.tsf -s -n # Show source without colors\n";
}
int main(int argc, char* argv[])
@@ -122,9 +133,11 @@ int main(int argc, char* argv[])
}
std::string filepath;
bool verbose = false;
bool test_incremental = false;
// 默认打印选项
PrintOptions opts = PrintOptions::Default();
// 解析命令行参数
for (int i = 1; i < argc; ++i)
{
@@ -136,7 +149,31 @@ int main(int argc, char* argv[])
}
else if (arg == "-v" || arg == "--verbose")
{
verbose = true;
opts = PrintOptions::Verbose();
}
else if (arg == "-c" || arg == "--compact")
{
opts = PrintOptions::Compact();
}
else if (arg == "-s" || arg == "--show-source")
{
opts.show_source_code = true;
}
else if (arg == "-l" || arg == "--hide-location")
{
opts.show_location = false;
}
else if (arg == "-n" || arg == "--no-colors")
{
opts.use_colors = false;
}
else if (arg == "-t" || arg == "--no-tree")
{
opts.use_tree_chars = false;
}
else if (arg == "-k" || arg == "--show-kind")
{
opts.show_node_kind = true;
}
else if (arg == "-i" || arg == "--incremental")
{
@@ -158,71 +195,68 @@ int main(int argc, char* argv[])
// 读取文件
std::cout << "Reading file: " << filepath << "\n";
std::string source = ReadFile(filepath);
if (verbose)
{
std::cout << "File size: " << source.length() << " bytes\n";
std::cout << "----------------------------------------\n";
std::cout << source << "\n";
std::cout << "----------------------------------------\n\n";
}
std::cout << "File size: " << source.length() << " bytes\n\n";
// 创建 Tree-Sitter 解析器
std::cout << "Parsing with Tree-Sitter...\n";
TreeSitterParser ts_parser;
TSTree* tree = ts_parser.Parse(source);
TSNode root = ts_parser.GetRootNode();
if (verbose)
{
std::cout << "Root node type: " << ts_node_type(root) << "\n";
std::cout << "Root node child count: " << ts_node_child_count(root) << "\n\n";
}
// 创建 AST 反序列化器
Deserializer deserializer;
ParseResult result;
if (test_incremental)
{
std::cout << "Using incremental parsing...\n";
std::cout << "Using incremental parsing...\n\n";
auto inc_result = deserializer.ParseIncremental(root, source);
result = std::move(inc_result.result);
std::cout << "Incremental Parse Statistics:\n";
std::cout << " Nodes parsed: " << inc_result.nodes_parsed << "\n";
std::cout << " Nodes unchanged: " << inc_result.nodes_unchanged << "\n";
std::cout << " Total nodes: " << inc_result.TotalNodes() << "\n";
std::cout << " Change rate: " << (inc_result.ChangeRate() * 100) << "%\n\n";
}
else
{
std::cout << "Using full parsing...\n";
result = deserializer.Parse(root, source);
}
// 打印解析结果
std::cout << "\n";
DebugPrint(result);
// 打印 AST 结果(带源码)
DebugPrint(result, source, opts);
// 打印摘要
std::cout << "\n========================================\n";
std::cout << "Summary:\n";
std::cout << "\n";
std::cout << Color::BrightBlue << "========================================\n"
<< Color::Reset;
std::cout << Color::BrightCyan << "Summary:\n"
<< Color::Reset;
std::cout << " File: " << filepath << "\n";
std::cout << " Size: " << source.length() << " bytes\n";
std::cout << " AST Nodes: " << result.statements.size() << "\n";
std::cout << " Errors: " << result.errors.size() << "\n";
if (result.root)
{
std::cout << " Statements: " << result.root->statements.size() << "\n";
}
std::cout << " Errors: ";
if (result.HasErrors())
{
std::cout << " Status: FAILED (with errors)\n";
std::cout << Color::BrightRed << result.errors.size() << "" << Color::Reset << "\n";
std::cout << " Status: " << Color::BrightRed << "FAILED" << Color::Reset << "\n";
return 1;
}
else
{
std::cout << " Status: SUCCESS\n";
std::cout << Color::BrightGreen << "0 ✓" << Color::Reset << "\n";
std::cout << " Status: " << Color::BrightGreen << "SUCCESS" << Color::Reset << "\n";
return 0;
}
}
catch (const std::exception& e)
{
std::cerr << "Error: " << e.what() << "\n";
std::cerr << Color::BrightRed << "Error: " << e.what() << Color::Reset << "\n";
return 1;
}
}