扩展Refactoring类 通过前面系统构架的介绍,大家知道了Refactoring和RefactoringWizard是完成EClipse重构功能的基础类。在创建好插件工程后,我们就通过扩展Refactoring来实现具体的功能。
Refactoring是所有支持代码转化的类的抽象父类,它在整个流程中与RefactoringWizard交互以完成重构的功能,起着非常重要的作用。这些类需要提供以下两类方法:
用于条件检查的方法,判断重构操作大体而言能否执行,以及具体的转化能否完成;
创建Change对象的方法,Change对象描述了所有将要执行的对当前代码的修改操作。
Refactoring类的典型流程如下所示:
1. 具体的Refactoring类被创建。
2. 获得用户选择的要进行重构的对象,初始化该Refactoring类。这个由具体的实现类给出相应的方法。
3. 在重构操作开始执行时,首先调用Refactoring的checkInitialConditions(IProgressMonitor) 基于用户选择的对象做一个的初始检查,这个通常由界面自动执行。返回RefactoringStatus.FATAL表明初始检查没有通过,重构操作不能继续。
4. 获得进行重构的其他参数,比如,对重命名操作来说就是指新名字。这个通常是由界面根据用户的输入提供的。由具体的实现类给出相应的方法。
5. 获得用户输入参数后,调用Refactoring的checkFinalConditions(IProgressMonitor)进行剩下的检查,这个通常由界面自动执行,返回RefactoringStatus.FATAL表明最后的检查没有通过,重构操作不能继续。
6. 调用Refactoring的createChange(IProgressMonitor)获得Change对象,这个通常由界面自动执行,界面可以根据Change对象显示预览界面。
基于以上的介绍,为了实现本文工程中的重构操作,我们需要扩展Refactoring类,为它增加一个构造函数,并且具体实现checkInitialConditions、checkFinalConditions和createChange三个函数。
首先通过菜单File -> New->Class弹出创建类的对话框,输入包名manage.annotation.refactor,类名AnnotationRefactoring,输入父类org.eclipse.ltk.core.refactoring.Refactoring,选中"继承抽象方法"复选框,点击完成按钮,一个扩展了Refactoring的最基本的类AnnotationRefactoring就被创建出来了。
首先为其增加构造函数,以用户选择的Java模型元素作为参数。Refactoring分析这个参数以得到所有相关的可写Java文件,作为重构操作的对象,如果该模型元素包含在Java文件中,则找到包含它的文件节点;如果该模型元素包含Java文件,则找到它的所有子Java文件。构造函数代码如下:
清单 6
public AnnotationRefactoring(IJavaElement element) { while (element.getElementType() > IJavaElement.COMPILATION_UNIT) { element = element.getParent(); if (element == null) return; } if (element.getElementType() == IJavaElement.COMPILATION_UNIT) { if (!element.isReadOnly()) compilationUnits.add(element); } if (element.getElementType() < IJavaElement.COMPILATION_UNIT) findWritableCompilationUnits(element); } |
接着完成checkInitialConditions函数,实现初始检查的具体操作。作为示例,在本文工程中我们不进行任何具体的检查操作,只简单得给出初始检查成功的信息,返回RefactoringStatus.
INFO以使重构操作继续执行。checkInitialConditions函数代码如下:
清单 7
public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException, OperationCanceledException { return RefactoringStatus.createInfoStatus("Initial Condition is OK!"); } |
接着完成checkFinalConditions函数,实现获得用户输入参数后的后续检查操作。在本文工程中,我们首先收集所有需要添加注释的以test开头的方法,判断是否不存在这样的方法,如果不存在给出出错信息,返回RefactoringStatus.FATAL以结束重构操作;如果存在这样的方法,则给出后续检查成功的信息,返回RefactoringStatus.
INFO。checkFinalConditions函数代码如下:
清单 8
public RefactoringStatus checkFinalConditions(IProgressMonitor pm) throws CoreException, OperationCanceledException { collectChanges(); if (fChangeManager.size() == 0) return RefactoringStatus.createFatalErrorStatus("No testing methods found!"); else return RefactoringStatus.createInfoStatus("Final condition is OK!"); } |
最后,创建Change对象的createChange函数是整个重构操作中最核心的代码,它的实现将在下面章节中介绍。