Объединение нескольких изменений рефакторинга JDT - PullRequest
0 голосов
/ 16 ноября 2018

С помощью моего плагина 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);
}
...