С помощью моего плагина eclipse я создал серию org.eclipse.ltk.core.refactoring.Change .
с ExtractMethodRefactoring , и я хотел бы внести изменения в исходный файл. Я пытался создать составное изменение со всеми изменениями рефакторинга как дочерними, но когда я вызываю составное изменение, изменения, кажется, вмешиваются друг в друга. Например, если я попытаюсь извлечь 1
и 2
ниже в методы:
оригинал:
package hello;
public class Exp { int x = 1 + 2;}
ожидается:
package hello;
public class Exp { int x = extracted461() + extracted421();
public int extracted461() {
return 1;
}
public int extracted421() {
return 2;
}
}
результат:
package hello;
public class Exp { int x = extrextracted461()c
public int extracted461() {
return a;
}ted421() + 1;
public int extracted421() {
return 2;
}}
Как я могу объединить рефакторинг / изменения и выполнить их вместе?
p.s. вот соответствующий код у меня есть:
private static void refactorCu(ICompilationUnit cu, NullProgressMonitor pm) throws CoreException {
List<int[]> ranges = getExpRanges(cu);
List<Change> changes = new ArrayList<>();
for (int[] sls : ranges) {changes.add(refactorMethod(cu, sls[0], sls[1]));}
Change[] cs = new Change[changes.size()];
cs = changes.toArray(cs);
CompositeChange cc = new CompositeChange("all refactoring");
cc.addAll(cs);
cc.perform(pm);
}
private static Change refactorMethod(ICompilationUnit cu, int start, int length) throws CoreException {
ExtractMethodRefactoring refactoring = new ExtractMethodRefactoring(cu, start, length);
refactoring.setMethodName("extracted" + String.valueOf(start) + String.valueOf(length));
refactoring.setVisibility(Modifier.PUBLIC);
NullProgressMonitor pm = new NullProgressMonitor();
refactoring.checkAllConditions(pm);
return refactoring.createChange(pm);
}