Zum Inhalt springen

OpenRewrite

Listen Sie OpenRewrite-Rezepte mit elide rewrite auf, sehen Sie sie in der Vorschau an und wenden Sie sie auf Java-Quellen an, fügen Sie Rezept-Abhängigkeiten hinzu und wählen Sie mit dem Codeindex Dateien vor dem Parsen aus.

Auf dieser Seite

elide rewrite führt OpenRewrite-Rezepte auf den Java-Hauptquellen eines Elide-Projekts aus. Damit automatisieren Sie Quelltextänderungen, sehen den Diff vorab und wenden dasselbe Rezept im Terminal oder in der CI an.

Experimentell in 1.6.0; eine Härtung der Rezeptkompatibilität ist für 1.6.1 geplant.

Rezept ansehen und anwenden

Führen Sie diese Befehle in einem Projekt mit elide.pkl und Java-Quellen aus:

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

--list gibt die Namen und Anzeigenamen der verfügbaren Rezepte aus. --dry-run gibt den vorgeschlagenen Diff aus, ohne Quelldateien zu ändern. Lassen Sie die Option weg, um die Änderungen anzuwenden, und führen Sie dann Ihre Tests aus. Abhängigkeitsauflösung, Indizierung und Kompilierung können auch bei einem Probelauf Build-Zustand schreiben.

Legen Sie für ein minimales Projekt elide.pkl an:

amends "elide:project.pkl"

name = "rewrite-demo"

Und 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");
  }
}

Das Rezept RemoveUnusedImports entfernt den ungenutzten Import List. Die Vorschau lässt die Datei unverändert; nach dem Anwenden hat ein zweiter Lauf nichts mehr zu ändern.

Rezeptmodule hinzufügen

Deklarieren Sie Rezept-JARs in dependencies.maven.devPackages. Ersetzen Sie die Beispielkoordinate unten durch die veröffentlichte Koordinate und Version Ihres Rezeptmoduls:

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

Führen Sie elide rewrite --list erneut aus, um die Rezepte des Moduls zu finden. Elide erkennt Rezeptklassen und deklarative YAML-Rezepte, die in diesen JARs unter META-INF/rewrite/ liegen. Wählen Sie ein deklaratives Rezept über seinen deklarierten Namen aus; eine CLI-Option zum Laden einer einzelnen YAML-Datei aus dem Projektverzeichnis gibt es nicht.

Rezepte laufen in der Reihenfolge, in der sie auf der Befehlszeile stehen:

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

Elide löst die Rezeptbibliotheken getrennt von den Anwendungsabhängigkeiten des Projekts auf. Wählen Sie Rezeptmodule, die mit dem mitgelieferten OpenRewrite 8.90.4 kompatibel sind; ein Modul, das einen neueren Kern anfordert, hebt die Kernversion des Runners nicht an.

Wie der Index genutzt wird

Der Codeindex für Abhängigkeiten von Elide liefert Typ- und Memberinformationen der Abhängigkeiten an den Java-Parser und an den Katalog, über den Rezepte gefunden werden. Ein Rewrite baut die benötigten Schichten des Abhängigkeitsindex automatisch.

Vor dem Umschreiben kompiliert Elide die Java- und Kotlin-Hauptquellen und indiziert ihre Referenzen. Für unterstützte explizite Typ- und Methoden-Vorbedingungen wählt es mit diesen Referenzen und Quelltext-Tokens die Kandidaten unter den Java-Dateien aus, bevor OpenRewrite sie parst. OpenRewrite prüft die Vorbedingungen des Rezepts weiterhin auf den ausgewählten Dateien.

Die Filterung unterstützt literale Typ- und Methodensuchen in deklarativen Vorbedingungen sowie optionale Vorbedingungs-Metadaten aus Rezeptmodulen. Bei nicht unterstützten Mustern oder unvollständigen Indexdaten bleibt das vollständige Source-Set erhalten. Rezepte, die das ganze Projekt durchsuchen müssen, parsen ebenfalls das vollständige Source-Set. Weniger Kandidaten verringern den Parse-Aufwand, aber Kompilierung und Indizierung haben eigene Kosten.

So überspringen Sie Kompilierung und Filterung:

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

Dabei wird jede Java-Hauptquelle geparst, und der Abhängigkeitsindex liefert weiterhin die Typinformationen. Das hilft beim Vergleich mit einem gefilterten Lauf oder bei einem Reparaturversuch an Quellen, die nicht kompilieren. Auch --list überspringt die Kompilierung der Hauptquellen.

Optionen

OptionWirkung
--listVerfügbare Rezepte auflisten und beenden.
--dry-runDiffs ausgeben, ohne Quelltextänderungen anzuwenden.
--no-prefilterKompilierung der Hauptquellen und Kandidatenfilterung überspringen.
--offlineLokal verfügbare Abhängigkeiten verwenden; Fehler, wenn benötigte Artefakte fehlen.

Der erste Lauf kann sowohl Projektabhängigkeiten als auch Rezeptbibliotheken herunterladen. Bereiten Sie sie mit einem Online-Lauf vor, bevor Sie --offline verwenden. Bei einem unbekannten Rezept endet der Befehl mit Exit-Code 1, bei einem ungültigen Aufruf mit 2.

Umfang und Grenzen

  • Eingabedateien stammen aus dem Java-Haupt-Source-Set. Kotlin-Quellen liefern kompilierte Referenzen, werden aber nicht umgeschrieben; Test-Source-Sets sind keine Eingaben für Rewrites.
  • Rezepte, die Annotationswerte an Abhängigkeitstypen lesen, werden nicht unterstützt. Den Typinformationen der Abhängigkeiten fehlen außerdem Annotations-Standardwerte sowie Parameter- und Typannotationen.
  • Benachbarte JARs im Workspace und als Dateisystempfade angegebene Abhängigkeiten sind nicht Teil der indizierten Typinformationen, die der Parser verwendet.
  • Die Rezeptkompatibilität variiert. Prüfen Sie den Diff des Probelaufs und führen Sie nach dem Anwenden die Tests aus.

Maven-, Gradle- und Bazel-Projekte

Diese Befehle verwenden eine elide.pkl-Projektdefinition. Die Integrationen für Maven, Gradle und Bazel wählen Compiler und andere Werkzeuge innerhalb dieser Builds aus; sie importieren deren Abhängigkeitsgraphen nicht in elide rewrite und fügen kein Rewrite-Goal, keinen Rewrite-Task und keine Rewrite-Regel hinzu.

Um diesen Workflow neben einem bestehenden Build zu nutzen, definieren Sie die passenden Source-Sets, die Zielversion, die Repositorys und die Abhängigkeiten in einer elide.pkl oder verwenden Sie Bestehendes Projekt übernehmen. Halten Sie diese Definition synchron mit dem Build, mit dem Sie das Ergebnis testen.

Zur Codeanalyse ohne Änderung der Quellen siehe Codeindex für Abhängigkeiten.

War diese Seite hilfreich?