この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 件のコメント:
コメントを投稿