問題タブ [libtooling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1009 参照

clang - Clang: 一定サイズの配列宣言のサイズに使用されるマクロ名を取得する方法

TL;DR;

callExpr -> arg_0 -> DeclRefExpr から、一定サイズの配列宣言のサイズに使用されるマクロ名を取得する方法。

詳細な問題の説明:

最近、追加の引数を使用して特定の関数呼び出しを変更するためのソースからソースへの変換ツールを必要とする課題に取り組み始めました。私が達成できる方法について再調査すると、この素晴らしいツールセット Clang が紹介されました。libtooling で提供されているさまざまなツールを使用して目標を達成する方法を学んでいます。しかし今、私は問題に行き詰まっています。ここであなたの助けを求めてください.

以下のプログラム (私のソースのダミー) を考慮してください。私の目標は、strcpy_s の安全なバージョンを使用して strcpy 関数へのすべての呼び出しを書き直し、新しい関数呼び出しに追加パラメーター、つまり宛先ポインターの最大サイズを追加することです。したがって、以下のプログラムでは、リファクタリングされた呼び出しは strcpy_s(inStr, STR_MAX, argv[1]); のようになります。

RecursiveVisitor クラスを作成し、VisitCallExpr メソッドですべての関数呼び出しを調べて、最初の引数の VarDecl を取得し、サイズ (ConstArrayType) を取得しようとしている dest 引数の最大サイズを取得します。ソース ファイルは既に前処理されているため、サイズとして 2049 が表示されますが、この場合必要なのはマクロ STR_MAX です。どうすればそれを取得できますか? (この情報で置換を作成し、後で RefactoringTool を使用して置換します)

0 投票する
2 に答える
1212 参照

c++ - Clangでテンプレート型のクラスメンバーの実際の型を取得するには?

たとえば、次のクラスがあります。

次のようにインスタンス化されます。

clang::CXXRecordDeclのノードを抽出し、class Fooそのフィールドを反復処理します。

fieldDecl->getInstantiatedType()私はそれをする何かが欲しいBar

CXXRecordDeclofの AST にFooは、インスタンス化された型に関する情報を含めるべきではないことを理解しています。このリンク情報が AST の別の場所に保存されているのか、どうすれば取得できるのか疑問に思っていました。


私の現在の解決策は、初期化されていないテンプレートパラメーターを順番に取得し、それらを に保存すること{A, B, C}です。次に、インスタンス化呼び出しを見つけ、インスタンス化された型を別の に順番に格納し、それらをインデックスでリンクして取得します。template<typename A, typename B, typename C> class Baz {};std::vectorBaz<Foo, Bar, Baz>std::vector

これは非常に複雑で、「un-Clang」のようです。

0 投票する
2 に答える
790 参照

c++ - Clang でテンプレート化されたクラスのインスタンス化された CXXRecordDecl を取得するにはどうすればよいですか?

たとえば、次のクラスがあります。

以下でインスタンス化されます。

CXXRecordDeclの解決済みフィールドとメソッドを使用して を取得するにはどうすればよいFoo<bar>ですか?


私は試した:

私が得る出力は次のとおりです。

ただし、CXXRecordDeclフィールドとメソッドも必要なので、それらを反復処理できます。私も試しました:

出力:

ご覧のとおり、 は にアクセスできますが、の型のインスタンス化については知りませんが、CXXRecordDecl class Foo definitionはアクセスします。FieldDeclbar_ClassTemplateSpecializationDecl

CXXRecordDeclインスタンス化された型が欲しいFieldDecl bar_

0 投票する
0 に答える
108 参照

c++ - libtooling を使用して複数の翻訳単位間でシンボルを相互参照する方法はありますか?

ライブラリと複数のアプリケーションがあります。Apps から Lib の API への関数呼び出しに関する使用統計を収集したいと考えています。基本的に私の現在のプロセスは次のとおりです。

  • すべての関数/メソッドの Lib を解析します
  • フォーマットされた方法で情報を出力する
  • その出力を使用して、アプリから統計を収集します。

私は現在、USRの形式で相互参照を提供する libclang API を使用しているため、関数のインデックスを作成し、それをアプリの解析時に使用しています。問題は、この API が制限されていることです。そのため、Libtooling に移行したいと考えています。

libtooling の API を調べましたが、似たようなものを見つけることができませんでした。私の質問は、Libtooling を使用してその「相互参照」を実現するための最良の方法は何でしょうか。

例は次のとおりです。

予想される出力は json ファイルです。