Eclipse中提供了几个扩展点,方便扩展重构功能。
基本的重构功能有,
Rename,Move,Create,Delete,Copy。对应扩展点即为:
org.eclipse.ltk.core.refactoring.renameParticipants
org.eclipse.ltk.core.refactoring.moveParticipants
org.eclipse.ltk.core.refactoring.createParticipants
org.eclipse.ltk.core.refactoring.deleteParticipants
org.eclipse.ltk.core.refactoring.copyParticipants
以ReName为例,其余4项与ReName大同小异。
实现这个扩展点的基本语法:
<extension point="org.eclipse.ltk.core.refactoring.renameParticipants">
<renameParticipant
id="refactoring.renameTypeParticipant"
name="RenameTypeParticipant"
class="refactoring.TypeRenameParticipant">
<enablement>
</enablement>
</renameParticipant>
</extension>
这里默认对响应所有改名事件,如果需要过滤可以在元素<enablement/>中加以定义。不赘述。实现改名扩展的关键在实现类,必须是org.eclipse.ltk.core.refactoring.participants.RenameParticipant;的子类
下面代码进行了简单的实现。
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
import org.eclipse.text.edits.ReplaceEdit;
public class TypeRenameParticipant extends RenameParticipant {
public TypeRenameParticipant() {
}
@Override
public RefactoringStatus checkConditions(IProgressMonitor pm,
CheckConditionsContext context) throws OperationCanceledException {
return new RefactoringStatus();
}
@Override
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
IFile file = ResourcesPlugin.getWorkspace().getRoot().getProject("a")
.getFile("a");
TextFileChange textFileChange = new TextFileChange("File Changed ",
file);
ReplaceEdit edit = new ReplaceEdit(0, 1, "haha");
textFileChange.setEdit(edit);
return textFileChange;
}
@Override
public String getName() {
return "RenameTypeParticipant";
}
@Override
protected boolean initialize(Object element) {
// need sub
return true;
}
}
CreateChange方法内实现过于粗糙,仅仅是为了可以让大家看到结果。
通过利用扩展点,我们就自然的将重构时的差异比较,警告,preview,重构history,redo/undo等,eclipse平台提供的基本功能加以利用了。
Preview的结果如下图。
下面我来介绍,通过扩展点实现特殊需求。
除了增,删,改,移等基本重构外,可以增加特殊需求的重构,比如JDT中对类,方法,变量名的重构。
实现特殊需求,就要实现自己的Refactoring类,继承类org.eclipse.ltk.core.refactoring.Refactoring实现相关方法,这个类的结构与RenameParticipant等类的结构基本一致,直接上代码,不再赘述。
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
public class ProducerRefactoring extends Refactoring {
@Override
public RefactoringStatus checkFinalConditions(IProgressMonitor pm)
throws CoreException, OperationCanceledException {
// need sub
return new RefactoringStatus();
}
@Override
public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
throws CoreException, OperationCanceledException {
// need sub
return new RefactoringStatus();
}
@Override
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
// need sub
return null;
}
@Override
public String getName() {
return "ProducerRefactoring";
}
}
这个类负责处理特殊需求与重构的特殊逻辑。
除了逻辑层,还需要对表现层有实现:
RefactoringWizard 及 RefactoringWizardPage。
实现了Refactoring,Wizard,WizardPage后,即完成了,UI到逻辑的实现。
通过相应的Action的配置,使用RefactoringWizardOpenOperation。即完成了特殊重构需求的开发。
为了方便对特殊需求的Refactoring逻辑部分的重用,eclipse提供了一个扩展点:
org.eclipse.ltk.core.refactoring.refactoringContributions
通过扩展点的配置,使用时通过ID即可随时得到Refactoring对象。
以上参考:http://www.eclipse.org/articles/article.php?file=Article-Unleashing-the-Power-of-Refactoring/index.html
欢迎讨论