2011年10月23日日曜日

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

ちょっと進展があったのでメモ。

clangにはTypeというクラスとその派生クラスがたくさんある。
構文解析結果としてそれを得られれば、その内容も調べられるかもしれない。

構文解析はclang::ParseAST()という関数にて実施する。このとき引数にclang::ASTContextのインスタンスを指定するのだが、このASTContextにTypeを反復するtypes_begin(), types_end()メンバ関数がある。

さて、Typeにはdump()という関数があるので、反復した要素に対してdump()してみると・・・

clang::ASTContext::const_type_iterator t = astContext.types_begin();
clang::ASTContext::const_type_iterator eot = astContext.types_end();
for(; t != eot; ++t)
{
 (*t)->dump();
}

int等の組み込み型やincludeしたC/C++の標準構造体などがすべて出力される。まあ当たり前か。

他にTypeで何かいいものがないかなぁと調べると、getTypeClass()というのがある。これをダンプ結果と組み合わせると、自作クラスでは値として22が返却される。getTypeClassName()を使うと、これはRecordという種別であるようだ。

こんなプログラムで

clang::ASTContext::const_type_iterator t = astContext.types_begin();
clang::ASTContext::const_type_iterator eot = astContext.types_end();
for(; t != eot; ++t)
{
 (*t)->dump();
 std::printf("%u %s\n", (*t)->getTypeClass(), (*t)->getTypeClassName());
 std::printf("-----------------------------------------------------------------------------------\n");
}

こんなのをパースして

#include 

class Temp
{
};
class Hoge;
int main(int, char**)
{
 std::printf("Hello,world\n");
 std::getchar();
 return 0;
}

こんな結果が出る(末尾付近を一部抜粋)

: class Temp identifier
ほげ    22      Record
-----------------------------------------------------------------------------------
: class Hoge identifier
ほげ    22      Record
-----------------------------------------------------------------------------------
: char **identifier
ほげ    2       Pointer
-----------------------------------------------------------------------------------
: int (identifier)(int, char **)
ほげ    14      FunctionProto
-----------------------------------------------------------------------------------

0 件のコメント:

コメントを投稿