CXXMethodDeclはヘッダを見ると、各関数の属性、例えば可視性であったり、戻り値の型であったりを取得できるようだ。
とりあえず、自分で明示的に定義したメンバ関数をリストアップしてみよう。
コード:
clang::ASTContext::const_type_iterator t = astContext.types_begin(); clang::ASTContext::const_type_iterator eot = astContext.types_end(); for(; t != eot; ++t) { clang::CXXRecordDecl* pDecl = (*t)->getAsCXXRecordDecl(); if( (pDecl != nullptr) && pDecl->hasDefinition() && pDecl->isClass() ) { pDecl->getDeclName().dump(); //pDecl->getDeclName().printName(llvm::outs()); // 基本クラスを確認する。 std::printf(">>>> base class >>>>\n"); clang::CXXRecordDecl::base_class_iterator base = pDecl->bases_begin(); clang::CXXRecordDecl::base_class_iterator eobase = pDecl->bases_end(); for(; base != eobase; ++base) { // CXXRecordDecl::base_class_iterator は CXXBaseSpecifier* 。 base->getType().dump(); } std::printf("<<<<\n"); // public なメンバ関数を列挙する。 std::printf(">>>> method >>>>\n"); clang::CXXRecordDecl::method_iterator method = pDecl->method_begin(); clang::CXXRecordDecl::method_iterator eomethod = pDecl->method_end(); for(; method != eomethod; ++method) { if( !method->isImplicit() && (method->getAccess() == clang::AS_public) ) { method->dump(); } } std::printf("<<<<\n"); std::printf("\n---------------------------------------------------------\n"); } }
調べるcppはこんな感じ。
#include <cstdio> namespace SuperNs { class Super { public: Super() { } void super_public_method() { } virtual void super_public_virtual_method() { } virtual void super_public_virtual_method_nooverride() { } private: void super_private_method() { } }; } namespace SubNs { class Sub : public SuperNs::Super { public: Sub() : Super() { } void sub_public_method() { } virtual void super_public_virtual_method() { } private: void sub_private_method() { } }; } int main(int, char**) { std::printf("Hello,world\n"); std::getchar(); return 0; }結果:
_Lockit >>>> base class >>>> <<<< >>>> method >>>> _Lockit()_Lockit(int)void ~_Lockit() noexceptstatic void _Lockit_ctor(int)static void _Lockit_dtor(int)<<<< --------------------------------------------------------- _Mutex >>>> base class >>>> <<<< >>>> method >>>> _Mutex()void ~_Mutex() noexceptvoid _Lock()void _Unlock()<<<< --------------------------------------------------------- _Init_locks >>>> base class >>>> <<<< >>>> method >>>> _Init_locks()void ~_Init_locks() noexcept<<<< --------------------------------------------------------- Super >>>> base class >>>> <<<< >>>> method >>>> Super() { } void super_public_method() { } virtual void super_public_virtual_method() { } virtual void super_public_virtual_method_nooverride() { } <<<< --------------------------------------------------------- Sub >>>> base class >>>> : SuperNs::Super identifier <<<< >>>> method >>>> Sub() : SuperNs::Super() { } void sub_public_method() { } virtual void super_public_virtual_method() { } <<<< --------------------------------------------------------- Super >>>> base class >>>> <<<< >>>> method >>>> Super() { } void super_public_method() { } virtual void super_public_virtual_method() { } virtual void super_public_virtual_method_nooverride() { } <<<< ---------------------------------------------------------
なんでか、Superが2回反復されている(コピペミスではない)。その他は一応意図通り動いているようだ。ただ「親クラスのメンバ関数は子クラスで反復されない」のはちょっと困った。
0 件のコメント:
コメントを投稿