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