Перейти до вмісту

Індекс коду залежностей

Будуйте індекс коду залежностей Maven в Elide і виконуйте запити до нього: знаходьте походження класів, вивчайте типи й члени, шукайте посилання з класів і локальні виклики в Java і Kotlin.

На цій сторінці

elide index відповідає на запитання про код у розв’язаних залежностях Maven і в скомпільованих основних вихідних файлах Java і Kotlin: яка залежність визначає клас, на що посилається клас і які локальні вихідні файли використовують тип або член. OpenRewrite використовує той самий індекс для типів залежностей і відбору файлів-кандидатів.

Експериментальна функція в 1.6.0; покращення сумісності заплановано на 1.6.1.

Побудова індексу

Виконайте в проєкті Elide з elide.pkl:

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

build розв’язує залежності, будує запитані шари залежностей і компілює основні вихідні файли Java і Kotlin, щоб оновити локальний індекс посилань. status показує доступні шари для кожного розв’язаного артефакту Maven; локальних класів він не виводить.

Наприклад, проєкт, що використовує Guava, може оголосити:

amends "elide:project.pkl"

name = "index-demo"

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

Додайте src/main/java/demo/Main.java:

package demo;

import com.google.common.collect.ImmutableList;

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

Після побудови індексу наведені нижче запити досліджують цю залежність і її використання в проєкті.

Пошук залежності, що визначає клас

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

Перший результат — адреса класу в основному classpath компіляції:

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

Якщо той самий клас визначають інші проіндексовані артефакти цього classpath, наступні рядки починаються з shadows і містять їхні адреси. Розв’язання йде в порядку classpath. Якщо в артефакту, розташованого раніше в classpath, немає потрібного індексу типів, команда повідомляє про відсутній шар, а не вгадує, яке визначення переважає.

Щоб вивести записи classpath у файловій системі, використовуйте elide classpath. Індекс коду знаходить визначення та посилання в коді; транзитивного шляху залежностей, яким з’явився артефакт, він не виводить.

Вивчення типів і членів

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()'

Запит артефакту виводить список проіндексованих типів. Запит типу виводить його вид, видимість, супертипи й запис в архіві; запит члена виводить вид, видимість, ознаку статичного члена чи члена екземпляра та JVM-дескриптор знайденого члена.

АдресаПозначає
maven:group:artifact:versionРозв’язаний артефакт Maven.
maven:group:artifact:version/package.TypeТип у цьому артефакті.
maven:group:artifact:version/package.Type#method(java.lang.String,int)Метод, вибраний за типами параметрів.
maven:group:artifact:version/package.Type#FIELDПоле.
local:project-name/package.TypeСкомпільований локальний тип, для references.

Використовуйте двійкові імена типів (package.Outer$Inner для вкладеного класу). Ключі методів не містять типу повернення; конструктори позначаються <init>(...). Беріть у лапки адреси з дужками, # або $, щоб командна оболонка їх не інтерпретувала.

Посилання з класу

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 виводить рядки type і member для типів і членів, на які посилається цей скомпільований клас. Команда приймає адресу типу, а не члена. У локальній адресі ім’я проєкту — це name з elide.pkl (або project, якщо ім’я не задано).

Пошук локальних використань

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 шукає в індексі посилань скомпільованих основних вихідних файлів і виводить відповідні вихідні файли зі шляхами відносно пакета, наприклад demo/Main.java. Ім’я методу без параметрів збігається з усіма його перевантаженнями; список параметрів вибирає одну сигнатуру. Результати сортуються, дублікати вилучаються. Якщо збігів немає, вивід порожній, і команда завершується успішно.

Запит охоплює локальні класи Java і Kotlin, а не виклики з усіх залежностей. Посилання, стерті під час компіляції, невикористані імпорти, коментарі та рефлексивні звертання, задані лише рядками, можуть бути відсутні. Перебудовуйте індекс після зміни вихідних файлів: запит не компілює їх і не оновлює локальних посилань.

Шари та оновлення

ШарІндексовані відомостіВикористовується для
l0Записи й метадані артефактуСтан артефактів і пошук рецептів.
l1Типи, видимість, супертипи й анотаціїЗапити типів і розв’язання класів.
l2Поля, методи, конструктори й сигнатуриЗапити членів і відомості про типи для переписування.
l3Посилання з класів на типи й члениЗапити references щодо залежностей.

За замовчуванням elide index build будує шари залежностей l0,l1. --layers вибирає шари для додавання; l0 включається завжди, а вже побудовані шари зберігаються. Для запитів членів включайте l1,l2 разом. build оновлює локальний індекс посилань незалежно від вибраних шарів залежностей.

Запити читають наявні дані індексу. Вони можуть розв’язувати залежності проєкту, але не будують відсутніх шарів. get, references і resolve завершуються з кодом 1 для невідомої адреси чи імені. Якщо потрібного шару немає, вони завершуються з кодом 2 і виводять команду для його побудови. Використовуйте --offline, щоб заборонити завантаження залежностей із мережі; потрібні артефакти тоді вже мають бути доступні локально.

Дані індексу залежностей зберігаються в .dev/dependencies/index/ з ключем за вмістом артефакту та версією формату індексу. Дані локальних посилань зберігаються в каталозі збирання проєкту. Звичайна компіляція не запитує всіх шарів індексу; будуйте їх явно або дозвольте споживачу, наприклад OpenRewrite, запитати те, що йому потрібно.

Область дії та інтеграція зі збиральниками

Індекс залежностей охоплює розв’язані JAR-файли Maven без класифікаторів. Пакети npm і PyPI, довільні шляхи до JAR-файлів у файловій системі та результати сусідніх проєктів робочого простору не входять до індексу залежностей. resolve шукає серед проіндексованих артефактів Maven в основному classpath компіляції; локальних класів і класів JDK він не розв’язує. Локальні адреси наразі підтримують references, а used-by шукає в локальному індексі за іменем типу чи члена.

Команди працюють з описом проєкту в elide.pkl. Використання компілятора Elide через плагін Maven, плагін Gradle або правила Bazel не заповнює цей індекс із графів залежностей цих інструментів. Щоб виконувати ці запити, опишіть відповідні вихідні файли й залежності в проєкті Elide.

Див. Залежності щодо оголошення залежностей і OpenRewrite щодо застосування рецептів з індексом.

Чи була ця сторінка корисною?