Lompat ke konten
cd /languages
  • BEAM konkuren
  • Pemrograman
  • Dukungan AST dan simbol

Elixir di Maguyva: graf kode untuk aplikasi Phoenix dan OTP

Maguyva mendukung Elixir dengan AST, simbol, dan graf, sehingga agen AI dapat menelusuri modul, behaviour, protokol, dan struct di seluruh kode Phoenix dan OTP.

Di mana Elixir menjebak alat AI yang dangkal

Hampir semua hal di Elixir adalah panggilan makro. defmodule, def, use, alias, dan @impl semuanya diurai sebagai panggilan, sedangkan use GenServer membawa perilaku yang tidak pernah terlihat di dalam berkas. Alat yang hanya melihat sintaksis panggilan tidak bisa membedakan definisi dari dependensi, atau callback GenServer dari fungsi pembantu.

Maguyva mengubah makro tersebut menjadi relasi, sehingga agen dapat melihat modul mana yang mengimplementasikan sebuah behaviour dan siapa yang memanggil sebuah fungsi context.

Apa yang diekstrak Maguyva dari Elixir

Maguyva mencakup berkas .ex dan .exs. Makro Elixir menjadi relasi sebagai berikut:

  • alias, import, dan require mencatat impor.
  • use mencatat impor. Untuk behaviour OTP dan framework seperti GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView, dan Ecto.Schema, ia juga mencatat bahwa modul tersebut mengimplementasikan behaviour itu.
  • Atribut @behaviour dan blok defimpl mencatat implementasi sebuah behaviour atau protokol.
  • Atribut modul yang dicadangkan seperti @doc, @spec, @impl, dan @callback dicatat sebagai anotasi pada fungsi yang mengikutinya. Atribut yang menyimpan nilai, seperti @timeout 5_000, tidak dicatat.
  • Literal struct %User{} dihitung sebagai instansiasi, raise mencatat lemparan, dan rescue serta catch mencatat tangkapan.

Makro bahasa seperti def, defp, defmodule, case, dan with difilter dari panggilan, sehingga graf panggilan menampilkan fungsi Anda sendiri.

Contoh prompt agen

  • “Siapa yang memanggil Accounts.register_user, dan dari controller mana saja?” (find_symbol, lalu dependency_search incoming)
  • “Modul mana saja yang mengimplementasikan GenServer?” (dependency_search)
  • “Telusuri permintaan pembayaran dari controller sampai ke basis data.” (get_task_context)

Batasan yang diketahui

  • Bentuk bernama def, defmodule, alias, dan import adalah node panggilan dalam tata bahasanya, sehingga hanya preset functions di structural_search yang mengembalikan hasil, dan hanya untuk fungsi anonim fn. Gunakan find_symbol untuk fungsi dan modul bernama.
  • Sekitar 55 panggilan pustaka standar seperti IO.puts, String.*, Enum.take, dan Process.* difilter dari relasi. Gunakan text_pattern_search untuk itu.
  • Elixir tidak memiliki pewarisan kelas, sehingga relasi pewarisan ditandai tidak berlaku.

Langkah berikutnya

Hubungkan repositori dengan panduan memulai cepat, lalu periksa matriks dukungan di halaman kompatibilitas. Untuk basis kode fungsional lainnya, baca panduan Haskell.

Paling cocok untuk

  • > Aplikasi Phoenix yang controller, LiveView, context, dan skema Ecto-nya saling memanggil di banyak modul.
  • > Sistem OTP yang dibangun dari GenServer, supervisor, dan task.
  • > Pustaka dan proyek umbrella tempat protokol diimplementasikan untuk banyak tipe.

Workflow agent

  • > Menemukan semua pemanggil fungsi context sebelum mengubah bentuk nilai kembaliannya.
  • > Mendaftar modul yang mengimplementasikan sebuah behaviour atau protokol sebelum menambahkan callback.
  • > Menelusuri permintaan dari controller Phoenix sampai ke lapisan Ecto.

Detail engine

  • > Dukungan Elixir mencakup berkas `.ex` dan `.exs`. `alias`, `import`, `require`, dan `use` mencatat impor.
  • > `use GenServer` dan behaviour OTP serta framework lain yang terdaftar, `@behaviour`, dan `defimpl` mencatat relasi implementasi.
  • > Atribut yang dicadangkan seperti `@spec` dan `@impl` menganotasi fungsi berikutnya; literal `%Struct{}` dihitung sebagai instansiasi.

Titik masuk MCP yang berguna

  • find_symbol

    Gunakan untuk fungsi context atau modul saat Anda membutuhkan definisi dan pemanggilnya; preset struktural tidak memilih bentuk `def` bernama.

  • dependency_search

    Gunakan penelusuran incoming untuk melihat modul mana yang mengimplementasikan behaviour atau protokol.

  • get_task_context

    Gunakan untuk prompt seperti "telusuri permintaan pembayaran dari controller sampai ke basis data".