2009年6月13日土曜日

EclipsePluginのBuilder追加での疑問

plugin.xmlのNatureの定義(org.eclipse.core.resources.natures)でbuilderを記述できると思うのですが、これを記述したとしてもbuilderが追加される訳でないのがふっと疑問になった。


こんな定義をかいてても、Natureのconfigure()で BuilderのIDを使ってICommandを作成し、IProjectDescription#setBuildSpecで設定する必要がある。

plugin.xmlで、そのNatureで使うBuilderのIDを設定しているんだから勝手に入ってくれてもいいのになぁーなんて。思って。

せめて、plugin.xmlで記述しているBuilderIDが取得できないもんか?
....コードにもIDを書かないといけないのが2重管理で面倒だし....
と思ってちょっと調べてみた。

Natureの拡張ポイントで設定されたBuilderIDは、IProjectNatureDescriptorの実装にはいってみるみたいです。
しかしながら、このインターフェースでは取得できるメソッドがなく、
org.eclipse.core.internal.resources.ProjectNatureDescriptor
という実装にキャストする必要があるみたい。internalだ。。なんか残念。

ちなみに、IProjectNatureDescriptorにはNatureの拡張ポイントで指定するrequires-natureを取得できるメソッドが用意されていて、Workspace#validateNatureSetから呼ばれています。

IProjectNatureDescriptorを取得するのは簡単で、こんな感じでとれます。


これで、Builderの設定があるIProjectNatureついて汎用的なコードが書けそうな気がする。
Natureの制約(requires-natureとかの記述)のチェックをして、Builderとして定義されているもの上記のコードを使って取得して登録してあげればOKOK?!
...internalだけど。

※追記
Natureの制約(requires-natureとかの記述)のチェックはNature#Configureではなくて、プロジェクト作成Wizardの時が正しいかも。
• • •