Zum Inhalt springen

Codeindex für Abhängigkeiten

Bauen Sie den Codeindex für Maven-Abhängigkeiten von Elide und fragen Sie ihn ab: Lösen Sie die Herkunft von Klassen auf, untersuchen Sie Typen und Member und finden Sie ausgehende Referenzen oder lokale Aufrufer in Java und Kotlin.

Auf dieser Seite

elide index beantwortet Fragen zum Code in Ihren aufgelösten Maven-Abhängigkeiten und in den kompilierten Java- und Kotlin-Hauptquellen: welche Abhängigkeit eine Klasse definiert, was eine Klasse referenziert und welche lokalen Quelldateien einen Typ oder Member verwenden. OpenRewrite nutzt denselben Index für Abhängigkeitstypen und die Auswahl von Kandidatendateien.

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

Index bauen

Führen Sie in einem Elide-Projekt mit elide.pkl aus:

elide index build --layers=l1,l2,l3
elide index status

build löst Abhängigkeiten auf, baut die angeforderten Abhängigkeitsschichten und kompiliert die Java- und Kotlin-Hauptquellen, um den lokalen Referenzindex zu aktualisieren. status meldet die verfügbaren Schichten für jedes aufgelöste Maven-Artefakt; lokale Klassen listet es nicht auf.

Ein Projekt, das Guava verwendet, kann zum Beispiel deklarieren:

amends "elide:project.pkl"

name = "index-demo"

dependencies {
  maven {
    packages { "com.google.guava:guava:33.4.8-jre" }
  }
}

Fügen Sie src/main/java/demo/Main.java hinzu:

package demo;

import com.google.common.collect.ImmutableList;

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

Nach dem Bauen des Index untersuchen die folgenden Abfragen diese Abhängigkeit und ihre Verwendung im Projekt.

Abhängigkeit finden, die eine Klasse definiert

elide index resolve com.google.common.collect.ImmutableList

Das erste Ergebnis ist die Adresse der Klasse im Haupt-Compile-Classpath:

maven:com.google.guava:guava:33.4.8-jre/com.google.common.collect.ImmutableList

Definieren weitere indizierte Artefakte in diesem Classpath dieselbe Klasse, beginnen die folgenden Zeilen mit shadows und nennen deren Adressen. Die Auflösung folgt der Classpath-Reihenfolge. Fehlt einem früheren Artefakt der nötige Typindex, meldet der Befehl die fehlende Schicht, statt zu raten, welche Definition gewinnt.

Um Classpath-Einträge im Dateisystem auszugeben, verwenden Sie elide classpath. Der Codeindex identifiziert Definitionen und Codereferenzen; den transitiven Abhängigkeitspfad, über den ein Artefakt hinzukam, gibt er nicht aus.

Typen und Member untersuchen

elide index get maven:com.google.guava:guava:33.4.8-jre
elide index get maven:com.google.guava:guava:33.4.8-jre/com.google.common.collect.ImmutableList
elide index get 'maven:com.google.guava:guava:33.4.8-jre/com.google.common.collect.ImmutableList#of()'

Die Artefaktabfrage listet die indizierten Typen auf. Eine Typabfrage gibt Art, Sichtbarkeit, Supertypen und Archiveintrag aus; eine Memberabfrage gibt Art, Sichtbarkeit, statisch oder Instanz sowie den JVM-Deskriptor des passenden Members aus.

AdresseBezeichnet
maven:group:artifact:versionEin aufgelöstes Maven-Artefakt.
maven:group:artifact:version/package.TypeEinen Typ in diesem Artefakt.
maven:group:artifact:version/package.Type#method(java.lang.String,int)Eine Methode, ausgewählt über die Parametertypen.
maven:group:artifact:version/package.Type#FIELDEin Feld.
local:project-name/package.TypeEinen kompilierten lokalen Typ, für references.

Verwenden Sie binäre Typnamen (package.Outer$Inner für eine verschachtelte Klasse). Methodenschlüssel lassen den Rückgabetyp weg; Konstruktoren verwenden <init>(...). Setzen Sie Adressen mit Klammern, # oder $ in Anführungszeichen, damit die Shell sie nicht interpretiert.

Ausgehenden Referenzen folgen

elide index references maven:com.google.guava:guava:33.4.8-jre/com.google.common.collect.ImmutableList
elide index references local:index-demo/demo.Main

references gibt type- und member-Zeilen für die Typen und Member aus, die diese kompilierte Klasse referenziert. Es erwartet eine Typadresse, keine Memberadresse. In einer lokalen Adresse ist der Projektname name aus elide.pkl (oder project, wenn kein Name gesetzt ist).

Lokale Verwendungen finden

elide index used-by com.google.common.collect.ImmutableList
elide index used-by 'com.google.common.collect.ImmutableList#of'
elide index used-by 'com.google.common.collect.ImmutableList#of()'

used-by durchsucht den Referenzindex der kompilierten Hauptquellen und gibt passende Quelldateien relativ zum Paket aus, etwa demo/Main.java. Ein bloßer Methodenname trifft alle Überladungen; eine Parameterliste wählt eine Signatur. Die Ergebnisse sind sortiert und ohne Duplikate. Ohne Treffer gibt es keine Ausgabe, und der Befehl endet erfolgreich.

Die Abfrage deckt lokale Java- und Kotlin-Klassen ab, nicht die Aufrufer aller Abhängigkeiten. Beim Kompilieren entfernte Referenzen, ungenutzte Imports, Kommentare und reflektive Verwendungen, die nur über Strings benannt sind, können fehlen. Bauen Sie den Index nach Änderungen an den Quellen neu; eine Abfrage kompiliert sie nicht und aktualisiert keine lokalen Referenzen.

Schichten und Aktualisierung

SchichtIndizierte InformationenGenutzt von
l0Artefakteinträge und MetadatenArtefaktstatus und Rezepterkennung.
l1Typen, Sichtbarkeit, Supertypen und AnnotationenTypabfragen und Klassenauflösung.
l2Felder, Methoden, Konstruktoren und SignaturenMemberabfragen und Typinformationen für Rewrites.
l3Ausgehende Typ- und Memberreferenzenreferences-Abfragen für Abhängigkeiten.

elide index build verwendet standardmäßig die Abhängigkeitsschichten l0,l1. --layers wählt hinzuzufügende Schichten; l0 ist immer enthalten, bereits gebaute Schichten bleiben erhalten. Nehmen Sie für Memberabfragen l1,l2 gemeinsam auf. build aktualisiert den lokalen Referenzindex unabhängig von den gewählten Abhängigkeitsschichten.

Abfragen lesen vorhandene Indexdaten. Sie können Projektabhängigkeiten auflösen, bauen aber keine fehlenden Schichten. get, references und resolve enden mit Exit-Code 1 bei einer unbekannten Adresse oder einem unbekannten Namen. Fehlt eine benötigte Schicht, enden sie mit Exit-Code 2 und geben einen Build-Befehl aus. Verwenden Sie --offline, um Downloads von Abhängigkeiten zu verhindern; benötigte Artefakte müssen dann bereits lokal vorliegen.

Die Daten des Abhängigkeitsindex liegen unter .dev/dependencies/index/, nach Artefaktinhalt und Version des Indexformats geschlüsselt. Lokale Referenzdaten liegen im Build-Verzeichnis des Projekts. Eine normale Kompilierung fordert nicht alle Indexschichten an; bauen Sie sie explizit, oder lassen Sie einen Nutzer wie OpenRewrite anfordern, was er braucht.

Umfang und Integration mit Build-Tools

Der Abhängigkeitsindex umfasst aufgelöste Maven-JARs ohne Classifier. npm- und PyPI-Pakete, beliebige JAR-Pfade im Dateisystem und Ausgaben benachbarter Workspace-Projekte sind keine Eingaben des Abhängigkeitsindex. resolve durchsucht indizierte Maven-Artefakte im Haupt-Compile-Classpath; lokale Klassen und JDK-Klassen löst es nicht auf. Lokale Adressen unterstützen derzeit references, während used-by den lokalen Index nach Typ- oder Membernamen durchsucht.

Die Befehle verwenden eine elide.pkl-Projektdefinition. Wenn Sie den Compiler von Elide über das Maven-Plugin, das Gradle-Plugin oder die Bazel-Regeln verwenden, wird dieser Index nicht aus den Abhängigkeitsgraphen dieser Werkzeuge befüllt. Definieren Sie die passenden Quellen und Abhängigkeiten in einem Elide-Projekt, um diese Abfragen zu nutzen.

Siehe Abhängigkeiten zum Deklarieren von Abhängigkeiten und OpenRewrite zum Anwenden von Rezepten mit dem Index.

War diese Seite hilfreich?