Skip to content

Architecture Build @ja

Hiroaki Otsu edited this page Apr 13, 2014 · 4 revisions

plsenseのモジュールのビルドについて

モジュールのビルドとは

モジュールを解析し、その結果を反映したオブジェクト群を生成する処理を差します。 モジュールのビルドは、BuildWorkerによって実施され、その処理フローは以下のようになっています。

処理フロー

プロジェクト設定をロード

  • プロジェクト設定ファイルパスが渡された場合、その設定をロードします。
  • 渡されなかった場合は、デフォルトプロジェクトが対象となります。

キャッシュから対象のモジュールオブジェクトをロード

  • ビルドの必要性チェックのため、現在キャッシュされているオブジェクトをロードします。
  • BuildWorkerにはビルド対象として、モジュール名またはファイルパスが渡されます。
  • ビルド対象が、まだ扱われていないプロジェクトファイルパスの場合、キャッシュが無い場合もあります。
  • ビルド対象が、モジュール名の場合、キャッシュが無いのは異常とみなします。(詳しくは、 モジュールオブジェクトの管理 を参照して下さい。)
  • キャッシュされたオブジェクトが保持しているファイルパスが存在しない場合には、モジュールが定義されたファイルが削除されたとみなし、処理を終了します。

ビルドの必要性

キャッシュされたオブジェクトが有り、既にビルド済みで、オブジェクトが保持している 更新日付が最新の更新日付と同じだった場合は、ビルドの必要性は無いと判断します。

対象ファイルコンパイル

上記のフローで、渡されたビルド対象から特定された対象ファイルパスがコンパイルできるかチェックし、 できなければ処理を終了します。

対象ファイルのソースからPPI::Documentやモジュールオブジェクトを取得

  • 対象ファイルのPPI::Documentを生成し、その構造を辿ることで、対象ファイルに定義されたモジュールを取得/生成します。
  • 前述の通りキャッシュが無い場合や、新しく定義されたモジュールの場合は、この時点でモジュールオブジェクトが生成されます。
  • この段階で生成されたモジュールは全てプロジェクトモジュールであると判断します。
  • 取得/生成したモジュールオブジェクトに、そのソースに当たる部分のPPI::Documentを保持させます。

各モジュールオブジェクトのビルド

ここで対象となるオブジェクトは、ビルド対象が、モジュール名ならば該当モジュールのみ、 ファイルパスならば全モジュールとなります。 モジュールオブジェクトはビルドが完了したらキャッシュに保存されますが、 保持しているPPI::Documentは、ビルドが完了したら不要なので、保存する前に削除されます。

B::XRefを使った解析

  • B::XRefを使って、モジュールの名前空間に定義されたメソッド/変数を抽出します。
  • use構文などでインポートされたメソッド/変数は、この処理でのみ補足されます。
  • メソッド/変数の情報は、オブジェクトとしてモジュールオブジェクトに保持されます。
  • 抽出されたメソッド/変数のオブジェクトがまだ無い場合は生成されます。
  • この段階で生成されたメソッド/変数は、一旦インポートされたものであるとみなされます。(後で変更されます。)

継承関係の解析

@ISAから親モジュールを取得します。

ドキュメントの解析

Perldocを取得し、各メソッド/変数に対する記述の抽出を試みます。

PPI::Documentの解析

  • 保持しているPPI::Documentを解析し、定義されたメソッド/変数を抽出します。
  • ステートメントを抽出し、 プラグイン に処理を委譲します。