2011年10月24日月曜日

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

Type.hを眺めていたら、isClassType()なるAPIを発見。さっそくgetClassType()の代わりに利用。きちんと動作した。

このclang::Type::isClassType()の実装や、すぐ下のisStructureType()の実装は興味深い。

bool Type::isClassType() const {
  if (const RecordType *RT = getAs<recordtype>())
    return RT->getDecl()->isClass();
  return false;
}
bool Type::isStructureType() const {
  if (const RecordType *RT = getAs<recordtype>())
    return RT->getDecl()->isStruct();
  return false;
}

まずTypeの派生クラスとしてRecordTypeがあり、反復中の型がクラスや構造体であるのなら、その実体はRecordTypeとして生成される。
かつRecordTypeにはgetDecl()なるAPIがあり、RecordDeclオブジェクトを返却してくれる。

ということで、Intellisenceにまかせてテキトーにコードを書いて実行してみた。

for(; t != eot; ++t)
{
 const clang::RecordType* pType = (*t)->getAs<clang::RecordType>();
 if(pType != nullptr)
 {
  const clang::RecordDecl* pDecl = pType->getDecl();
  if( (pDecl != nullptr) && pDecl->isClass() )
  {
   pDecl->getDeclName().dump();
  }
 }
}

結果。

type_info
_Lockit
_Mutex
_Init_locks

クラス名が取得できるようになった。

0 件のコメント:

コメントを投稿