#include "tool.hpp" #include #include #include #include #include // Forward declarations extern "C" TSLanguage *tree_sitter_cpp(); std::vector readFileList(const std::string &list_file) { std::vector files; std::ifstream file(list_file); if (!file.is_open()) { spdlog::error("Could not open list file {}", list_file); return files; } std::string line; while (std::getline(file, line)) { if (line.empty() || line[0] == '#') continue; if (line.find('*') != std::string::npos) { spdlog::info("Skipping wildcard pattern: {}", line); continue; } if (std::filesystem::exists(line)) { files.push_back(line); } else { spdlog::warn("File not found: {}", line); } } return files; } bool processFile(const std::string &filepath, DatabaseManager &db, FileType file_type) { std::ifstream file(filepath); if (!file.is_open()) { spdlog::error("Could not open file {}", filepath); return false; } std::string file_content((std::istreambuf_iterator(file)), std::istreambuf_iterator()); TSParser *parser = ts_parser_new(); ts_parser_set_language(parser, tree_sitter_cpp()); TSTree *tree = ts_parser_parse_string(parser, nullptr, file_content.c_str(), file_content.length()); TSNode root_node = ts_tree_root_node(tree); if (ts_node_is_null(root_node)) { spdlog::error("Failed to parse file {}", filepath); ts_tree_delete(tree); ts_parser_delete(parser); return false; } db.clearEntriesForFile(filepath); std::vector functions; findFunctions(root_node, file_content.c_str(), file_content.length(), functions, file_type); for (auto &func : functions) { func.filepath = filepath; db.insertFunction(func); spdlog::debug("{}: {} @ {} in {} (type: {})", func.is_import ? "Import" : "Function", func.name, func.address, filepath, fileTypeToString(func.type)); } spdlog::info("Processed {} functions/imports from {} (type: {})", functions.size(), filepath, fileTypeToString(file_type)); ts_tree_delete(tree); ts_parser_delete(parser); return true; } bool processGlobalsFile(const std::string &filepath, DatabaseManager &db) { std::ifstream file(filepath); if (!file.is_open()) { spdlog::error("Could not open file {}", filepath); return false; } std::string file_content((std::istreambuf_iterator(file)), std::istreambuf_iterator()); TSParser *parser = ts_parser_new(); ts_parser_set_language(parser, tree_sitter_cpp()); TSTree *tree = ts_parser_parse_string(parser, nullptr, file_content.c_str(), file_content.length()); TSNode root_node = ts_tree_root_node(tree); if (ts_node_is_null(root_node)) { spdlog::error("Failed to parse file {}", filepath); ts_tree_delete(tree); ts_parser_delete(parser); return false; } db.clearGlobalsForFile(filepath); std::vector globals; findGlobals(root_node, file_content.c_str(), file_content.length(), globals); for (auto &global : globals) { global.filepath = filepath; db.insertGlobal(global); spdlog::debug("Global: {} @ {} in {}", global.name, global.address, filepath); } spdlog::info("Processed {} globals from {}", globals.size(), filepath); ts_tree_delete(tree); ts_parser_delete(parser); return true; }