Подтвердить что ты не робот

Есть ли способ применить рефакторинг script только для его побочных эффектов?

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

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

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

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

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

    public T getContent() {
        return content;
    }
}

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

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

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

<?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>

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

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

Рефакторинг "Ввести Factory" (org.eclipse.jdt.ui.introduce.factory) не может быть выполнен, так как его вход "scratch.MyContainer.java" не существует.

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

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

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

Примечание 3: даже способ вручную указать "заменить экземпляры объекта X на этот конструктор с помощью вызовов этого метода". [/p >

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

4b9b3361

Ответ 1

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

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