3

いくつかのコンテキスト

私はlibclangに精通していません。libclang への python バインディングを使用する vim プラグインを変更しています。

カーソルパラメータを受け取るpython関数があります。これは、現在の C++ バッファーの AST 内のほぼすべてのノードに対して呼び出されます。

問題

cursor.kindカーソルの種類を取得するために使用されます。それ以外はすべて問題ありません

  • テンプレート化された無料の関数宣言、
  • テンプレート化されたコンストラクタ宣言と
  • テンプレート化されたメソッド宣言

すべて同じ種類: FUNCTION_TEMPLATE. それらを区別する必要があります。

さらなる洞察

たとえば、上記のテンプレート化されていないバージョンには次の種類があります。

  • FUNCTION_DECL
  • CXX_METHOD
  • CONSTRUCTOR.

cindex.pyのソースを検索しましたが、CXX_METHOD_TEMPLATEまたはCONSTRUCTOR_TEMPLATE類似のものはありません。

私は何とかして必要な情報を取得しようとしましたが、成功しませんでしcursor.get_definition()cursor.underlying_typedef_type.get_declaration()

私が得た唯一の部分的な成功は、メソッドとコンストラクターのセマンティックおよびレキシカルな親がSTRUCT_DECL.

テンプレート化されているかどうかはあまり気にしません。それがコンストラクター、メンバー、またはフリー関数であるかどうかは気にしません。

要約すると

カーソルが与えられた場合、それがメソッド (テンプレートであっても)、コンストラクター (テンプレートであっても)、または自由な関数宣言であるかどうかをどのように判断できますか?

4

1 に答える 1

2

tl;dr

cindex.CursorKind.from_id(cindex.conf.lib.clang_getTemplateCursorKind(cursor))

C libclang のオンライン doxygen ドキュメントを参照すると、C++ AST イントロスペクションで関数clang_getTemplateCursorKindが見つかります。

CINDEX_LINKAGE enum CXCursorKind  clang_getTemplateCursorKind (CXCursor C)

テンプレートを表すカーソルが与えられた場合、テンプレートをインスタンス化することによって生成される特殊化のカーソルの種類を決定します。

これはまさに私が欲しいものです。残念ながら、Python で呼び出すのは簡単ではありません。

周りを見渡すとC、Python で明示的に実装されていない関数を次のように呼び出します。

tk = cindex.conf.lib.clang_getTemplateCursorKind(cursor)

聞かないで、黒魔術。

次の問題は、この関数が long を返すことです。CursorKindオブジェクトが本当に必要な場合は、次のものが必要です。

cindex.CursorKind.from_id(tk)
于 2016-02-25T17:18:38.867 に答える