#pragma once #include #include #include #include "../../src/language/symbol/table.hpp" #include "../../src/protocol/protocol.hpp" namespace lsp::language::symbol::debug { using SymbolKind = protocol::SymbolKind; // ==================== 打印选项 ==================== struct PrintOptions { bool use_color = true; // 使用颜色 bool show_location = true; // 显示位置信息 bool show_details = true; // 显示详细信息 bool show_children = true; // 显示子符号 bool compact_mode = false; // 紧凑模式 int indent_size = 2; // 缩进大小 int max_depth = -1; // 最大深度 (-1 = 无限制) static PrintOptions Default(); static PrintOptions Compact(); static PrintOptions Verbose(); static PrintOptions NoColor(); }; // ==================== 统计信息 ==================== struct Statistics { size_t total_symbols = 0; size_t total_scopes = 0; std::unordered_map symbol_counts; std::unordered_map scope_counts; void Compute(const SymbolTable& table); void Print(std::ostream& os, bool use_color = true) const; }; // ==================== 核心打印器 ==================== class DebugPrinter { public: explicit DebugPrinter(const SymbolTable& table, const PrintOptions& options = PrintOptions::Default()); // ===== 顶层打印接口 ===== void PrintAll(std::ostream& os = std::cout); void PrintOverview(std::ostream& os = std::cout); void PrintStatistics(std::ostream& os = std::cout); // ===== 符号打印 ===== void PrintSymbol(SymbolId id, std::ostream& os = std::cout, int depth = 0); void PrintSymbolTree(SymbolId id, std::ostream& os = std::cout, int depth = 0); void PrintSymbolList(std::ostream& os = std::cout); void PrintSymbolsByKind(SymbolKind kind, std::ostream& os = std::cout); // ===== 作用域打印 ===== void PrintScope(ScopeId id, std::ostream& os = std::cout, int depth = 0); void PrintScopeTree(ScopeId id, std::ostream& os = std::cout, int depth = 0); void PrintScopeHierarchy(std::ostream& os = std::cout); // ===== 搜索和查询 ===== void FindAndPrint(const std::string& name, std::ostream& os = std::cout); void FindAtLocation(const ast::Location& loc, std::ostream& os = std::cout); // ===== 选项管理 ===== void SetOptions(const PrintOptions& options) { options_ = options; } const PrintOptions& GetOptions() const { return options_; } private: const SymbolTable& table_; PrintOptions options_; Statistics stats_; // ===== 辅助方法 ===== std::string Indent(int depth) const; std::string ColorizeSymbolKind(SymbolKind kind) const; std::string ColorizeSymbolName(const std::string& name, SymbolKind kind) const; std::string FormatLocation(const ast::Location& loc) const; std::string FormatSymbolKind(SymbolKind kind) const; std::string FormatScopeKind(ScopeKind kind) const; std::string SymbolIcon(SymbolKind kind) const; void PrintSeparator(std::ostream& os, char ch = '=', int width = 80) const; void PrintHeader(const std::string& title, std::ostream& os) const; void PrintSubHeader(const std::string& title, std::ostream& os) const; std::string Color(const char* color_code) const; std::string Bold(const std::string& text) const; std::string Dim(const std::string& text) const; void PrintSymbolData(const Symbol& symbol, std::ostream& os, int depth); void PrintSymbolWithChildren(SymbolId id, const std::unordered_multimap& children, std::ostream& os, int depth, int current_depth); std::string GetSymbolIcon(const Symbol& symbol) const; }; // ==================== 快速打印函数 ==================== void Print(const SymbolTable& table, std::ostream& os = std::cout); void PrintOverview(const SymbolTable& table, std::ostream& os = std::cout); void PrintStats(const SymbolTable& table, std::ostream& os = std::cout); void PrintSymbolTree(const SymbolTable& table, std::ostream& os = std::cout); void PrintScopeTree(const SymbolTable& table, std::ostream& os = std::cout); void Find(const SymbolTable& table, const std::string& name, std::ostream& os = std::cout); void PrintCompact(const SymbolTable& table, std::ostream& os = std::cout); void PrintVerbose(const SymbolTable& table, std::ostream& os = std::cout); } // namespace lsp::language::symbol::debug