中国领先的IT技术网站
|
|

Eclipse重构功能:扩展点的使用

本文介绍了Eclipse重构功能的实现。Eclipse中提供了几个扩展点,方便扩展重构功能。 基本的重构功能有Rename,Move,Create,Delete,Copy。

作者:defrag_sly来源:defrag_sly的博客|2009-08-13 18:00

沙龙活动 | 去哪儿、陌陌、ThoughtWorks在自动化运维中的实践!10.28不见不散!


Eclipse中提供了几个扩展点,方便扩展重构功能。

基本的重构功能有,

Rename,Move,Create,Delete,Copy。对应扩展点即为:

  1. org.eclipse.ltk.core.refactoring.renameParticipants    
  2. org.eclipse.ltk.core.refactoring.moveParticipants    
  3. org.eclipse.ltk.core.refactoring.createParticipants    
  4. org.eclipse.ltk.core.refactoring.deleteParticipants    
  5. org.eclipse.ltk.core.refactoring.copyParticipants   

以ReName为例,其余4项与ReName大同小异。

实现这个扩展点的基本语法:

  1. < extension point="org.eclipse.ltk.core.refactoring.renameParticipants">    
  2. < renameParticipant    
  3.     id="jp.co.intramart.app.producer.refactoring.renameTypeParticipant"    
  4.     name="Ebuilder RenameTypeParticipant"     
  5.     class="jp.co.intramart.app.producer.refactoring.TypeRenameParticipant">     
  6.     < enablement>    
  7.     < /enablement>        
  8. < /renameParticipant>    
  9. < /extension>   

这里默认对响应所有改名事件,如果需要过滤可以在元素< enablement/>中加以定义。不赘述。实现改名扩展的关键在实现类,必须是org.eclipse.ltk.core.refactoring.participants.RenameParticipant;的子类

下面代码进行了简单的Eclipse重构功能实现。

  1. import org.eclipse.core.resources.IFile;    
  2. import org.eclipse.core.resources.ResourcesPlugin;    
  3. import org.eclipse.core.runtime.CoreException;    
  4. import org.eclipse.core.runtime.IProgressMonitor;    
  5. import org.eclipse.core.runtime.OperationCanceledException;    
  6. import org.eclipse.ltk.core.refactoring.Change;    
  7. import org.eclipse.ltk.core.refactoring.RefactoringStatus;    
  8. import org.eclipse.ltk.core.refactoring.TextFileChange;    
  9. import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;    
  10. import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;    
  11. import org.eclipse.text.edits.ReplaceEdit;    
  12.     
  13. public class TypeRenameParticipant extends RenameParticipant {    
  14.     
  15.     public TypeRenameParticipant() {    
  16.     }    
  17.     
  18.     @Override    
  19.     public RefactoringStatus checkConditions(IProgressMonitor pm,    
  20.             CheckConditionsContext context) throws OperationCanceledException {    
  21.         return new RefactoringStatus();    
  22.     }    
  23.     
  24.     @Override    
  25.     public Change createChange(IProgressMonitor pm) throws CoreException,    
  26.             OperationCanceledException {    
  27.         IFile file = ResourcesPlugin.getWorkspace().getRoot().getProject("a")    
  28.                 .getFile("a");    
  29.         TextFileChange textFileChange = new TextFileChange("File Changed ",    
  30.                 file);    
  31.     
  32.         ReplaceEdit edit = new ReplaceEdit(01"haha");    
  33.         textFileChange.setEdit(edit);    
  34.         return textFileChange;    
  35.     }    
  36.     
  37.     @Override    
  38.     public String getName() {    
  39.         return "Ebuilder RenameTypeParticipant";    
  40.     }    
  41.     
  42.     @Override    
  43.     protected boolean initialize(Object element) {    
  44.         // need sub    
  45.         return true;    
  46.     }    
  47.     
  48. }   

CreateChange方法内实现过于粗糙,仅仅是为了可以让大家看到结果。

Eclipse重构功能结果预览

通过利用扩展点,我们就自然的将重构时的差异比较,警告,preview,重构history,redo/undo等,eclipse平台提供的基本功能加以利用了。

Preview的结果如下图。

Preview的结果

Eclipse重构功能:特殊需求

下面我来介绍,通过扩展点实现特殊需求。

除了增,删,改,移等基本重构外,可以增加特殊需求的重构,比如JDT中对类,方法,变量名的重构。

实现特殊需求,就要实现自己的Refactoring类,继承类org.eclipse.ltk.core.refactoring.Refactoring实现相关方法,这个类的结构与RenameParticipant等类的结构基本一致,直接上代码,不再赘述。

  1. import org.eclipse.core.runtime.CoreException;    
  2. import org.eclipse.core.runtime.IProgressMonitor;    
  3. import org.eclipse.core.runtime.OperationCanceledException;    
  4. import org.eclipse.ltk.core.refactoring.Change;    
  5. import org.eclipse.ltk.core.refactoring.Refactoring;    
  6. import org.eclipse.ltk.core.refactoring.RefactoringStatus;    
  7.     
  8. public class ProducerRefactoring extends Refactoring {    
  9.     
  10.     @Override    
  11.     public RefactoringStatus checkFinalConditions(IProgressMonitor pm)    
  12.             throws CoreException, OperationCanceledException {    
  13.         // need sub    
  14.         return new RefactoringStatus();    
  15.     }    
  16.     
  17.     @Override    
  18.     public RefactoringStatus checkInitialConditions(IProgressMonitor pm)    
  19.             throws CoreException, OperationCanceledException {    
  20.         // need sub    
  21.         return new RefactoringStatus();    
  22.     }    
  23.     
  24.     @Override    
  25.     public Change createChange(IProgressMonitor pm) throws CoreException,    
  26.             OperationCanceledException {    
  27.         // need sub    
  28.         return null;    
  29.     }    
  30.     
  31.     @Override    
  32.     public String getName() {    
  33.         return "ProducerRefactoring";    
  34.     }    
  35.     
  36. }   

这个类负责处理特殊需求与重构的特殊逻辑。

除了逻辑层,还需要对表现层有实现:

RefactoringWizard 及 RefactoringWizardPage。

实现了Refactoring,Wizard,WizardPage后,即完成了,UI到逻辑的实现。

通过相应的Action的配置,使用RefactoringWizardOpenOperation。即完成了特殊重构需求的开发。

为了方便对特殊需求的Refactoring逻辑部分的重用,eclipse提供了一个扩展点:

org.eclipse.ltk.core.refactoring.refactoringContributions

通过扩展点的配置,使用时通过ID即可随时得到Refactoring对象。

本文来自站在eclipse的肩膀上:《简单介绍eclipse中的重构》。

【编辑推荐】

  1. 在Eclipse中安装pydev插件的经验分享
  2. 自定义Eclipse菜单项:去除多余的UI图标
  3. 六大便捷Eclipse JDT特性一览
  4. 部署Eclipse RAP到Tomcat的步骤详解
  5. Eclipse平台应用与开发专题
【责任编辑:杨赛 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

ASP快速建站全程实录

本书从一个网站制作过程入手,详细介绍基于ASP技术建设网站的全过程。全书共10章。第1章,网站制作规划与流程;第2章,IIS安装与调试;第3...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× Python最火的编程语言