2011年10月25日火曜日

CLangでクラスの中身を調べる:Rebuild(5)

clang::RecordTypeにはgetAsCXXRecordDecl()というAPIもあり、clang::CXXRecordDeclが取得できる。このCXXRecordDeclのヘッダを眺めると、なかなか魅力的なAPIがある。

base_class_iterator bases_begin() { return data().getBases(); }

名前から、当該型の基本クラスを反復できることは容易に想像できる。

ところがこのbases_begin()をコールするとアサーションされてしまう。どうもメンバ変数が設定されてない様子。
CXXRecordDecl::hasDecinition()にて、このメンバ変数が設定されているかどうかを判定できるようだ。

こんなコードで

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->isClass() )
 {
  if(pDecl->hasDefinition())
  {
   clang::CXXRecordDecl::base_class_iterator base = pDecl->bases_begin();
   clang::CXXRecordDecl::base_class_iterator eobase = pDecl->bases_end();
   for(; base != eobase; ++base)
   {
    base->getType().dump();
   }
  }
 }
}

こんな結果

: class Super identifier

正しく判定できている様子。
このhasDefinition()が何を意味するのか・・・。

0 件のコメント:

コメントを投稿