Идентификатор переименования в Java-программе - PullRequest
3 голосов
/ 17 августа 2010

Мне нужно программно переименовать идентификаторы в заданной области, например, метод в Java-программе.Например, учитывая следующую функцию Java:

public void doSomething(){
   int x = 10;
   int y = x * 2;
   int z = x + y;
}

после переименования переменных (от x до a, y до b и от z до c), я должен получить следующую функцию:

public void doSomething(){
   int a = 10;
   int b = a * 2;
   int c = a + b;
}

Как программно реализовать такое переименование идентификаторов и их ссылок?

Я изучал Eclipse AST и Java Model.В любом случае мне нужно реализовать поиск всех вхождений любого заданного идентификатора, а затем заменить их.Мне интересно, есть ли лучший способ сделать это (как интерфейс Eclipse Refactoring поддерживает такое переименование переменных)?Или я должен посмотреть на языковой инструментарий (org.eclipse.ltk.core.refactoring)?Любой учебник, пример кода или предложение?

Пожалуйста, помогите.

Ответы [ 4 ]

1 голос
/ 20 августа 2010

Мне неясно, хотите ли вы выполнить это переименование по всем направлениям (т. Е. Все методы во всех классах) или просто для определенных классов, которые вы бы идентифицировали вручную. Предполагая последнее, я бы порекомендовал вам:

  1. Используйте API отражения Java java.lang.reflect для определения всех методов, определенных в конкретном классе, для которого требуется локальный Переименование переменной.
  2. Итерация по всем методам. Для каждого метода используйте API org.eclipse.jdt.core для перехода по иерархии элементов компиляции, выбирая определения переменных в локальной области видимости. Получить имя переменной для блок компиляции.
  3. Создайте новое имя переменной. Что-то вроде: Old ==> OldRenamed. Примените любое эвристическое переименование, которое вы пожелаете на этом этапе.
  4. Вызовите комплект разработки Eclipse org.eclipse.jdt.ui.refactoring Методы API для переименования переменных в рамках метода. По сути, вы будете использовать функциональность Eclipse Rename Variable без использования этого API.

Это должно сработать.

0 голосов
/ 16 ноября 2010

Я могу переименовать, используя следующий код.

RenameSupport renameSupport = RenameSupport.create(field, newName, RenameSupport.UPDATE_REFERENCES);
renameSupport.perform(workbench.getShell(), workbench);

Но он применяет изменения к фактическим исходным файлам. Есть ли в любом случае, что можно предотвратить? Мне просто нужен переименованный код внутри, не нужно менять фактический источник.

0 голосов
/ 18 августа 2010

Я действительно сомневаюсь в целесообразности этого, но это можно сделать с помощью процессора аннотаций.Вы должны будете признать, что обработчик аннотаций не может изменять существующий исходный код, но может создавать новый исходный код, который по сути является клоном оригинала (за исключением переименований).

  1. Создание аннотаций, определяющихпоиск и замена.
  2. Добавьте свой исходный код.Вы можете создать исходный файл package-info.java и аннотировать на уровне пакета.
  3. Ваш процессор может использовать API дерева компиляторов с помощью метода Trees.instance .
  4. Вы можете расширить SimpleTreeVisitor , чтобы выполнить фактическое копирование.Это будет утомительно, но не очень сложно.

Единственный вариант использования, о котором я могу подумать, это то, что вы подготовили исходный код с именами переменных, которые имеют смысл на человеческом языке A (например, на японском языке).), и вы хотите обсудить это с аудиторией (начальник, студенты, клиенты и т. д.), которая более комфортно владеет человеческим языком B (например, арабским)

Кроме этого, я не могу придумать ни одной веской причиныпойти на столько неприятностей.В приведенном примере x, y и z являются локальными переменными.Поскольку область действия настолько мала, переименование действительно не нужно.

0 голосов
/ 18 августа 2010
  • Выберите переменную
  • Щелкните правой кнопкой мыши
  • Выбор рефактора
  • Выберите переименовать
  • переименовать переменную

Eclipse переименует эту переменную во всех местах, где она используется

...