2016-12-01 5 views
2

ITranslationUnitおよびIASTTranslationUnitインターフェイスは、それぞれ単一のC/C++ソースファイルの変換単位とASTを表します。Eclipse CDT:C++プロジェクトのASTを取得

C++プロジェクト全体のASTを取得する方法はありますか、メインファイルのASTから開始し、インクルードディレクティブをナビゲートし、ソースユニットごとに個別のASTを生成する必要がありますか?

ありがとうございました。

答えて

3

CDTのASTは、プロジェクト全体に合わせて設計されていません。一度10000+ LOCの範囲に入ると、それはかなり悪く実行される可能性が高いです。

CDTには、インデクサがあり、プロジェクト内の各ファイルを1つずつ解析し(プロジェクト全体のコードに関する情報のデータベースを構築します。 インデックス)。インデックスは、IIndexインターフェイスを介してアクセスされます。そのインスタンスは、任意のASTのIASTTranslationUnit.getIndex()を呼び出して(たとえば)取得できます。

ほとんどのコード解析と操作の使用例は、次のワークフローのいずれかに分類されます。

  • ちょうどインデックスを使用しています。

  • findReferences(binding)はあなたを与えるために結合
  • findDeclarations(binding)へのすべての参照を与えるために、名前や名前のプレフィックスに一致するバインディングを見つけるためfindBindings()

    • さまざまなオーバーロード:IIndexは、次のような、あなたで動作するように多くのことを与えますバインディングのすべての宣言。


    などがあります。これは、Open DeclarationやCall Hierarchyのようなエディタのナビゲーション機能の仕組みです。

  • インデックスを使用して、ASTが必要な少数のソースファイルを特定し、それらを解析します。これがリファクタリングの仕組みです。たとえば、リネームリファクタリングでは、インデックスを使用して名前を変更しているバインディングの使用を特定し、そのリファクタリングを実行するためにその使用を含むファイルのASTを作成します。

  • 上記のいずれでも十分ではなく、プロジェクト内のすべてのファイルに対してASTレベルの情報が本当に必要な場合は、プロジェクト内のすべてのファイルのASTを1つずつ作成し、必要な情報を抽出しますそれぞれ。これがインデクサーそのものです。 (このオプションを選択すると、解析する必要があるすべてのファイルを一覧表示するためにインクルードする必要はありませんが、プロジェクト内のすべてのファイルを列挙できます)。

あなたのユースケースの詳細については、より具体的な提案をすることができます。

+0

私はあなたがCDTが1つのソースファイルを自然に解析し、インクルードファイルは解析しないと言っていると思います。したがって、必要な宣言情報がインクルードファイルに含まれている場合、CDTはどのように「最も厄介な構文解析」(または他の構文的にあいまいな構文)を解析しますか? http:// stackoverflowを参照してください。17393852#17393852 –

+0

@IraBaxter:インデクサーはファイルを依存関係の順序で解析し、インデックス内の以前に解析されたファイルから情報を検索します。 – HighCommander4

+0

プリプロセッサの条件変数の状態の不変性に関する仮定の下では? (1つのCUが#define FLAG TRUEを実行し、もう1つのCUが#define FLAG FALSEを実行し、その両方がそのフラグをチェックするヘッダーを含むと想像することができます) –

関連する問題