6

私は、アプリケーションのソースコードのリファクタリングに役立つ簡単なツールを書いています。.uiGUIを定義し、Qtで使用するXMLファイルを生成するwxWidgetsライブラリに基づいてC++コードを解析したいと思います。すべての関数呼び出しと引数の値を取得する必要があります。

現在、ClangへのPythonバインディングをいじっています。以下のサンプルコードを使用して、トークンとその種類と場所を取得しますが、カーソルの種類は常にCursorKind.INVALID_FILEです。

import sys
import clang.cindex

def find_typerefs(node):
    """ Find all references to the type named 'typename'
    """

    for t in node.get_tokens():
        if not node.location.file != sys.argv[1]:
            continue
        if t.kind.value != 0 and t.kind.value != 1 and t.kind.value != 4:
            print t.spelling
            print t.location
            print t.cursor.kind
            print t.kind
            print "\n"

index = clang.cindex.Index.create()
tu = index.parse(sys.argv[1])
print 'Translation unit:', tu.spelling
find_typerefs(tu.cursor)

カーソルの種類を判別する正しい方法は何ですか?

いくつかのブログ投稿を除いてドキュメントは見つかりませんでしたが、それらは古くなっているか、このトピックをカバーしていませんでした。Clangに付属している例からもそれを理解することができませんでした。

4

1 に答える 1

5

カーソル オブジェクトの場合は、cursor.kind を使用するだけで問題ありません。おそらく問題は、子カーソルオブジェクトではなくトークンを歩いていることです(それについてはわかりません)。get_tokens の代わりに、get_children を使用して AST を実行できます。

AST がどのように見えるかを確認するために、AST ウォーキング関数を書きたいときに、次のスクリプトを使用します: https://gist.github.com/2503232。これはcursor.kindを表示するだけで、私のシステムでは適切な出力が得られます。いいえCursorKind.INVALID_FILE.

于 2013-10-22T22:05:49.803 に答える