clang を使用してインクルードファイルの出力

そんなわけで、clang の libclang と cindex.py を使用した簡単な C++ のコード解析です。
とりあえず、インクルードしているヘッダーファイルの出力とか。

[Python ソース]

import sys
import clang.cindex

target = "main.cpp"

index = clang.cindex.Index.create()
tree = index.parse(target)

for value in tree.get_includes():
    print value.source.name

[C++ ソース]

#include <string>

int
main(){
    
    return 0;
}

[出力]

main.cpp
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++config.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++config.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/char_traits.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/functexcept.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_pair.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/move.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/move.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_iterator_base_types.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/char_traits.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/postypes.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\cwchar
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\cwchar
c:/mingw/include\wchar.h
c:/mingw/include\wchar.h
c:/mingw/include\wchar.h
c:/mingw/include\wchar.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/char_traits.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\cwchar
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/allocator.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++allocator.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\ext/new_allocator.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\new
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\new
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/localefwd.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++locale.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\clocale
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++locale.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/localefwd.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/localefwd.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\cctype
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/ostream_insert.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_function.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/basic_string.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\ext/atomicity.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/gthr.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/gthr-default.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\ext/atomicity.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/basic_string.h
c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string

こんな感じで、clang を使用すれば比較的簡単に C++ のコード解析を行うことが出来ます。
しかし、明確なドキュメントが見当たらず、どこまで出来るのかがよく分からないので、今後も実際にコードを書いてみて色々と試してみたいと思います。
多分続く…?

[Version]

[注意]

使用している、clang は、svn のものを使用しているので、現行のリリース版である、clang 2.9 では動かない可能性があります。
cindex.py も2.9 と 3.0 では、中身が違っていました。