Есть ли способ применить скрипт рефакторинга только для его побочных эффектов? - PullRequest
12 голосов
/ 27 сентября 2011

У меня есть библиотека, которая была изменена, чтобы ввести фабричный метод для замены конструктора (причины сейчас не важны, в данном случае это было в основном для улучшенного вывода типов).

Предполагая, что является сценарием рефакторинга Eclipse для него (так что у меня есть хорошее читаемое описание изменения), есть ли способ применить этот сценарий к проектучто только использует этой библиотеки (т.е. она имеет ссылку только на скомпилированную версию библиотеки)?

Например, я начинаю с этого простого класса:

public class MyContainer<T> {
    private final T content;

    public MyContainer(final T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

Теперь я представляю фабрику (не делая конструктор приватным, но это сейчас не очень актуально), метод фабрики выглядит так:

public static <T> MyContainer<T> holding(T content) {
    return new MyContainer<T>(content);
}

Когда я сейчас экспортирую скрипт миграции, он выглядитнапример:

<?xml version="1.0" encoding="UTF-8"?>
<session version="1.0">
<refactoring comment="Introduce factory &apos;holding&apos; in &apos;scratch.MyContainer&apos; for constructor &apos;scratch.MyContainer.MyContainer()&apos;&#x0A;- Original project: &apos;scratch&apos;&#x0A;- Original element: &apos;scratch.MyContainer.MyContainer()&apos;&#x0A;- Factory name: &apos;holding&apos;&#x0A;- Owner class: &apos;scratch.MyContainer&apos;"
             description="Introduce factory for &apos;MyContainer&apos;"
             element1="/src&lt;scratch{MyContainer.java[MyContainer"
             flags="589830" id="org.eclipse.jdt.ui.introduce.factory"
             input="/src&lt;scratch{MyContainer.java"
             name="holding" project="scratch" protect="false"
             selection="89 0" version="1.0"/>
</session>

Этот должен содержать достаточно информации, чтобы применить рефакторинг к другому проекту, который ссылается (текущая версия *) на clзадница через файл jar.

Но попытка применить рефакторинг выдает мне эту ошибку:

Перефразирующая «Представляем фабрику») не может быть выполнена, так как его вход «scratch.MyContainer.java» не существует.

Обратите внимание, что в явно упоминается .java, поэтому он ищет исходный файли не довольствуется применением рефакторинга к двоичному типу.

Примечание: I не хочет исправить двоичную библиотеку.Я просто хочу, чтобы вызывающие исходного конструктора были преобразованы в вызов метода фабрики.

Примечание 2: Поиск и поискзамена не поможет в моем конкретном случае.Причина в том, что у меня есть двух конструкторов, один из которых принимает Object, а другой - String.Они должны быть сопоставлены двум различным фабричным методам, поэтому мне понадобится функция поиска и замены для просмотра информации о типе аргумента.

Примечание3: даже способ вручную указать «заменить экземпляры объекта X на этот конструктор вызовами этого метода вместо» будет приветствоваться.

Обновление: Существуетзапись bugzilla в bugzilla Eclipse, о добавляющая рефакторинг вызова замены .Реализация этой функции может решить мою проблему, если «вызов» включает создание объекта с помощью данного конструктора.К сожалению, в последние несколько лет активность не наблюдалась (хотя она планировалась на 3.2).

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Я думаю, вам придется написать свой собственный плагин рефакторинга. tests для org.eclipse.jdt.ui.tests.refactoring - это интересное место для начала.

Некоторые интересные чтения по теме:

1 голос
/ 03 октября 2011

Это не способ применить рефакторинг только к абонентам, но он может решить вашу проблему.

Можно ли добавить в ваш проект поддельный файл MyContainer.java, имеющий те же подписи, что и в библиотеке, применить рефакторинг, а затем отбросить файл Java?Вы могли бы даже использовать декомпилированный soure, хотя вам, возможно, придется генерировать его самостоятельно.

...