-
Notifications
You must be signed in to change notification settings - Fork 9
Scalability @ja
plsenseの拡張性について
plsenseには、 Module::Pluggable が使用されており、以下の処理を拡張することができます。
各プラグインは、デフォルトで幾つか存在するので、それらも参考にして下さい。
モジュールのビルド の「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を検査し、自身だけが補完候補を提供すべきコンテキストならば真を返す |
また、上記メソッドが真を返す場合、上記メソッド内で以下のメソッドを適切に実行する必要があります。
ユーザが入力中と思われる文字列を設定する。 登録された補完候補の中で、設定された文字列に前方一致する補完候補のみがクライアントに提供されます。
提供する補完候補の登録を行う。
各補完候補毎に実行する。
第1引数に、補完候補の文字列を指定する。
補完候補に対応する PlSense::Symbol
オブジェクトがある場合は、第2引数にそれを指定する。
このオブジェクトは、 assisthelp で利用される。