From 606f005a3be9a7b252f55250abe63e84014dcd6a Mon Sep 17 00:00:00 2001 From: Redbeanw44602 Date: Sat, 1 Mar 2025 23:46:09 +0800 Subject: [PATCH] refactor: dump symbol frontend action now using TypedSymbolList. --- src/data_format/type/decl_type.h | 2 +- src/frontend_action/dump_symbol.cpp | 57 +++++++---------------------- src/frontend_action/dump_symbol.h | 6 ++- 3 files changed, 18 insertions(+), 47 deletions(-) diff --git a/src/data_format/type/decl_type.h b/src/data_format/type/decl_type.h index ba20251..d6ee47b 100644 --- a/src/data_format/type/decl_type.h +++ b/src/data_format/type/decl_type.h @@ -24,7 +24,7 @@ public: COUNT }; - constexpr explicit DeclType(Enum value) : m_data(value) {} + constexpr DeclType(Enum value) : m_data(value) {} constexpr explicit DeclType(std::string_view str) { using namespace util::string; diff --git a/src/frontend_action/dump_symbol.cpp b/src/frontend_action/dump_symbol.cpp index 9618aca..aa6eadd 100644 --- a/src/frontend_action/dump_symbol.cpp +++ b/src/frontend_action/dump_symbol.cpp @@ -1,5 +1,7 @@ #include "frontend_action/dump_symbol.h" +#include "data_format/typed_symbol_list.h" + #include #include #include @@ -7,27 +9,14 @@ using namespace clang; +using namespace di; +using namespace di::data_format; + namespace { -bool config_record_decl_name = false; - -class Container : private std::unordered_set { -public: - void put(const std::string& symbol) { emplace(symbol); } - - void write_to(const std::string& path) { - std::ofstream ofs(path); - if (ofs) { - for (const auto& E : *this) { - ofs << E << "\n"; - } - } - } -}; - class Visitor : public RecursiveASTVisitor { public: - Visitor(ASTContext& context, Container& container) + Visitor(ASTContext& context, TypedSymbolList& container) : m_namegen(context), m_symbol_container(container) {} @@ -54,14 +43,10 @@ public: auto mangled_name = m_namegen.getName(decl); if (!mangled_name.empty()) { - if (config_record_decl_name) { - mangled_name = std::format( - "{}, {}", - decl->getDeclKindName(), - mangled_name - ); - } - m_symbol_container.put(mangled_name); + m_symbol_container.record( + mangled_name, + DeclType{decl->getDeclKindName()} + ); } return true; @@ -69,7 +54,7 @@ public: private: ASTNameGenerator m_namegen; - Container& m_symbol_container; + TypedSymbolList& m_symbol_container; }; class Consumer : public ASTConsumer { @@ -77,7 +62,7 @@ public: explicit Consumer(ASTContext&) {} void HandleTranslationUnit(ASTContext& context) override { - Container symbols; + TypedSymbolList symbols; Visitor(context, symbols) .TraverseDecl(context.getTranslationUnitDecl()); @@ -86,7 +71,7 @@ public: auto& source_manager = context.getSourceManager(); auto source_location = source_manager.getLocForStartOfFile(source_manager.getMainFileID()); - symbols.write_to( + symbols.write( source_manager.getFilename(source_location).str() + ".symbols" ); } @@ -103,20 +88,4 @@ std::unique_ptr DumpSymbolFrontendAction::CreateASTConsumer( return std::make_unique(instance.getASTContext()); } -bool DumpSymbolFrontendAction::ParseArgs( - const CompilerInstance&, - const std::vector& args -) { - for (const auto& arg : args) { - if (arg.ends_with("record-decl-name")) { - config_record_decl_name = true; - } - } - return true; -} - -PluginASTAction::ActionType DumpSymbolFrontendAction::getActionType() { - return AddAfterMainAction; -} - } // namespace di::frontend_action diff --git a/src/frontend_action/dump_symbol.h b/src/frontend_action/dump_symbol.h index b4feefa..a52b5c8 100644 --- a/src/frontend_action/dump_symbol.h +++ b/src/frontend_action/dump_symbol.h @@ -19,9 +19,11 @@ protected: bool ParseArgs( const clang::CompilerInstance&, const std::vector& args - ) override; + ) override { + return true; + } - ActionType getActionType() override; + ActionType getActionType() override { return AddAfterMainAction; } }; } // namespace di::frontend_action