Skip to content
Hiroaki Otsu edited this page Apr 14, 2014 · 6 revisions

plsenseの拡張性について

plsenseには、 Module::Pluggable が使用されており、以下の処理を拡張することができます。

各プラグインは、デフォルトで幾つか存在するので、それらも参考にして下さい。


PPI::Documentの解析

モジュールのビルド の「PPI::Documentの解析」処理において、 以下の2つの名前空間にあるプラグインを呼び出します。

  • PlSense::Plugin::PPIBuilder
  • PlSense::Plugin::IncludeStmt

全体のフローとプラグインの関数が実行されるタイミングは以下のようになっています。

  • 「…または…実行」は、 PPI::Statement::Variable の場合、 variable_statement が実行されます。
  • プラグインは各々、 PlSense::Plugin::PPIBuilder / PlSense::Plugin::IncludeStmt を継承して下さい。

アドレスの検索

PlSense::AddressFinder による PPI::Tokenから アドレス / エンティティ を抽出する処理で、 単一のメソッド呼び出しが見つかった時、そのメソッド名に対応するプラグインを 以下の名前空間から探し、見つかれば、以降の抽出処理をそれに委譲します。

  • PlSense::Plugin::AddressFinder::Builtin
  • PlSense::Plugin::AddressFinder::Ext

以下のコードから得られたPPI::Tokenに対して find_address が実行されると、

grep { $_->get_name eq 'main' } @Hoge::Fuga::all_modules;

grep というメソッド名を得た後、 PlSense::Plugin::AddressFinder::Builtin::Grep::find_address を呼び出し、その戻り値を使用します。 上記の場合、 @Hoge::Fuga::all_modules というアドレスが得られます。

実装

プラグインは、その対象のメソッドに応じて、以下のように実装して下さい。

  • 以下の名前空間に配置
  • 名前空間と同名のモジュールを継承
  • 自身の扱うメソッド名を、以下のメソッドで返す
名前空間 対象 自メソッド名を返すメソッド
PlSense::Plugin::AddressFinder::Builtin 組み込み関数 get_builtin_name
PlSense::Plugin::AddressFinder::Ext 組み込みでない関数 get_method_name

また、適切に以下のメソッドを実装して下さい。

find_address 受け取ったPPI::Tokenのリストからアドレスを返す
find_address_or_entity 受け取ったPPI::Tokenのリストからアドレス/エンティティを返す

コード補完

assist コマンドで要求されるコード補完の結果は、 PlSense::Plugin::CodeAssistant 配下の プラグインによって提供されます。 プラグインは、上記名前空間と同名のモジュールを継承し、必要に応じて以下のメソッドを実装して下さい。

is_valid_context 与えられたPerlコード/PPI::Tokenを検査し、補完候補を提供できるコンテキストならば真を返す
is_only_valid_context 与えられたPerlコード/PPI::Tokenを検査し、自身だけが補完候補を提供すべきコンテキストならば真を返す

また、上記メソッドが真を返す場合、上記メソッド内で以下のメソッドを適切に実行する必要があります。

set_input

ユーザが入力中と思われる文字列を設定する。 登録された補完候補の中で、設定された文字列に前方一致する補完候補のみがクライアントに提供されます。

push_candidate

提供する補完候補の登録を行う。 各補完候補毎に実行する。 第1引数に、補完候補の文字列を指定する。 補完候補に対応する PlSense::Symbol オブジェクトがある場合は、第2引数にそれを指定する。 このオブジェクトは、 assisthelp で利用される。

Clone this wiki locally