Перейти к содержимому

OpenRewrite

Просматривайте список рецептов OpenRewrite, предварительно смотрите и применяйте их к исходникам Java через elide rewrite, добавляйте зависимости рецептов и отбирайте файлы перед разбором с помощью индекса кода.

На этой странице

elide rewrite запускает рецепты OpenRewrite для основных исходников Java в проекте Elide. С его помощью можно автоматизировать изменения кода, просмотреть diff заранее и применить тот же рецепт из терминала или в CI.

Экспериментальная функция в 1.6.0; повышение совместимости рецептов запланировано на 1.6.1.

Просмотр и применение рецепта

Выполните эти команды в проекте с elide.pkl и исходниками Java:

elide rewrite --list
elide rewrite org.openrewrite.java.RemoveUnusedImports --dry-run
elide rewrite org.openrewrite.java.RemoveUnusedImports
elide test

--list выводит имена доступных рецептов и их отображаемые названия. --dry-run выводит предлагаемый diff, не изменяя исходные файлы. Уберите его, чтобы применить изменения, а затем запустите тесты. Разрешение зависимостей, индексация и компиляция могут записывать состояние сборки и при пробном запуске.

Для минимального проекта создайте elide.pkl:

amends "elide:project.pkl"

name = "rewrite-demo"

И src/main/java/demo/Main.java:

package demo;

import java.util.List;

public class Main {
  public static void main(String[] args) {
    System.out.println("Hello");
  }
}

Рецепт RemoveUnusedImports удаляет неиспользуемый импорт List. Предварительный просмотр оставляет файл без изменений; после применения повторный запуск ничего не меняет.

Добавление модулей рецептов

Объявите JAR-файлы рецептов в dependencies.maven.devPackages. Замените условную координату ниже на опубликованную координату и версию вашего модуля рецептов:

dependencies {
  maven {
    devPackages {
      "com.example:rewrite-recipes:1.0.0"
    }
  }
}

Снова выполните elide rewrite --list, чтобы увидеть рецепты модуля. Elide находит классы рецептов и декларативные рецепты YAML, упакованные в этих JAR-файлах в META-INF/rewrite/. Декларативный рецепт выбирается по объявленному имени; параметра CLI для загрузки отдельного YAML-файла из каталога проекта нет.

Рецепты выполняются в том порядке, в котором указаны в командной строке:

elide rewrite org.openrewrite.java.RemoveUnusedImports org.openrewrite.java.format.AutoFormat --dry-run

Elide разрешает библиотеки рецептов отдельно от зависимостей приложения. Выбирайте модули рецептов, совместимые со встроенной версией OpenRewrite 8.90.4; модуль, требующий более нового ядра, не обновляет версию ядра исполнителя.

Как используется индекс

Индекс кода зависимостей Elide передаёт сведения о типах и членах зависимостей парсеру Java и каталогу, по которому находятся рецепты. При запуске elide rewrite нужные слои индекса зависимостей строятся автоматически.

Перед перезаписью Elide компилирует основные исходники Java и Kotlin и индексирует их ссылки. Для поддерживаемых явных предусловий по типам и методам он по этим ссылкам и токенам исходного кода отбирает файлы Java-кандидаты до того, как OpenRewrite их разберёт. OpenRewrite по-прежнему проверяет предусловия рецепта на отобранных файлах.

Фильтрация поддерживает поиск типов и методов по точному имени в декларативных предусловиях, а также необязательные метаданные предусловий из модулей рецептов. При неподдерживаемых шаблонах или неполных данных индекса сохраняется весь набор исходников. Рецепты, которым нужен просмотр всего проекта, тоже разбирают весь набор исходников. Меньший набор кандидатов сокращает разбор, но у компиляции и индексации есть своя цена.

Чтобы пропустить компиляцию и фильтрацию:

elide rewrite org.openrewrite.java.RemoveUnusedImports --dry-run --no-prefilter

В этом случае разбираются все основные исходники Java, а сведения о типах по-прежнему берутся из индекса зависимостей. Это полезно для сравнения с фильтрованным запуском или для попытки исправить исходники, которые не компилируются. --list тоже пропускает компиляцию основных исходников.

Параметры

ПараметрДействие
--listВывести доступные рецепты и завершиться.
--dry-runВывести diff, не применяя изменения к исходникам.
--no-prefilterПропустить компиляцию основных исходников и отбор кандидатов.
--offlineИспользовать локально доступные зависимости; завершиться с ошибкой, если нужных артефактов нет.

Первый запуск может загрузить и зависимости проекта, и библиотеки рецептов. Подготовьте их запуском с доступом к сети, прежде чем использовать --offline. Неизвестный рецепт завершает команду с кодом 1, неверное использование команды — с кодом 2.

Область действия и ограничения

  • Входные файлы берутся из основного набора исходников Java. Исходники Kotlin дают скомпилированные ссылки, но не перезаписываются; тестовые наборы исходников во входные данные не входят.
  • Рецепты, читающие значения аннотаций у типов зависимостей, не поддерживаются. В сведениях о типах зависимостей также нет значений аннотаций по умолчанию и аннотаций параметров и типов.
  • Соседние JAR-файлы рабочего пространства и зависимости, указанные как пути в файловой системе, не попадают в индексированные сведения о типах, которые использует парсер.
  • Совместимость рецептов различается. Проверяйте diff пробного запуска и запускайте тесты после применения изменений.

Проекты Maven, Gradle и Bazel

Эти команды работают с описанием проекта в elide.pkl. Интеграции с Maven, Gradle и Bazel выбирают компиляторы и другие инструменты внутри этих сборок; они не импортируют свои графы зависимостей в elide rewrite и не добавляют цель, задачу или правило для перезаписи.

Чтобы использовать этот рабочий процесс вместе с существующей сборкой, опишите нужные наборы исходников, целевую версию, репозитории и зависимости в elide.pkl или воспользуйтесь разделом Перенос существующего проекта. Синхронизируйте это описание со сборкой, с помощью которой вы проверяете результат.

Для изучения кода без изменения исходников см. Индекс кода зависимостей.

Была ли эта страница полезной?