Chuyển tới nội dung
cd /languages
  • BEAM đồng thời
  • Lập trình
  • Hỗ trợ AST và symbol

Elixir trên Maguyva: đồ thị mã cho ứng dụng Phoenix và OTP

Maguyva hỗ trợ Elixir với AST, ký hiệu và đồ thị, để agent AI có thể lần theo module, behaviour, protocol và struct trong mã Phoenix và OTP.

Elixir làm khó các công cụ AI hời hợt ở đâu

Gần như mọi thứ trong Elixir đều là lời gọi macro. defmodule, def, use, alias và @impl đều được phân tích như lời gọi, còn use GenServer mang vào những hành vi không bao giờ xuất hiện trong tệp. Một công cụ chỉ thấy cú pháp lời gọi sẽ không phân biệt được định nghĩa với phụ thuộc, hay callback GenServer với hàm trợ giúp.

Maguyva biến các macro đó thành quan hệ, để agent thấy module nào triển khai một behaviour và ai gọi một hàm context.

Maguyva trích xuất gì từ Elixir

Maguyva bao quát các tệp .ex và .exs. Các macro của Elixir trở thành quan hệ như sau:

  • alias, import và require ghi lại import.
  • use ghi lại một import. Với các behaviour của OTP và framework như GenServer, Supervisor, Agent, Task, Phoenix.Controller, Phoenix.LiveView và Ecto.Schema, nó còn ghi lại rằng module triển khai behaviour đó.
  • Thuộc tính @behaviour và khối defimpl ghi lại việc triển khai một behaviour hoặc protocol.
  • Các thuộc tính module dành riêng như @doc, @spec, @impl và @callback được ghi thành chú thích cho hàm đứng sau. Thuộc tính lưu giá trị, như @timeout 5_000, không được ghi lại.
  • Literal struct %User{} được tính là khởi tạo, raise ghi lại một lần ném, còn rescue và catch ghi lại một lần bắt.

Các macro của ngôn ngữ như def, defp, defmodule, case và with bị lọc khỏi lời gọi, nên đồ thị lời gọi hiển thị các hàm của chính bạn.

Ví dụ prompt cho agent

  • “Ai gọi Accounts.register_user, và từ những controller nào?” (find_symbol, sau đó dependency_search theo chiều vào)
  • “Những module nào triển khai GenServer?” (dependency_search)
  • “Lần theo một yêu cầu thanh toán từ controller tới cơ sở dữ liệu.” (get_task_context)

Giới hạn đã biết

  • Các dạng có tên def, defmodule, alias và import là nút lời gọi trong ngữ pháp, nên chỉ preset functions trong structural_search trả về kết quả, và chỉ cho các hàm ẩn danh fn. Dùng find_symbol cho hàm và module có tên.
  • Khoảng 55 lời gọi thư viện chuẩn như IO.puts, String.*, Enum.take và Process.* bị lọc khỏi quan hệ. Dùng text_pattern_search cho chúng.
  • Elixir không có kế thừa lớp, nên các quan hệ kế thừa được đánh dấu là không áp dụng.

Bước tiếp theo

Kết nối một kho mã bằng hướng dẫn bắt đầu nhanh, sau đó xem ma trận hỗ trợ trên trang tương thích. Với các codebase hàm khác, hãy đọc hướng dẫn Haskell.

Phù hợp nhất

  • > Ứng dụng Phoenix có controller, LiveView, context và schema Ecto gọi lẫn nhau qua nhiều module.
  • > Hệ thống OTP được xây từ GenServer, supervisor và task.
  • > Thư viện và dự án umbrella nơi protocol được triển khai cho nhiều kiểu.

Workflow agent

  • > Tìm mọi nơi gọi một hàm context trước khi đổi dạng giá trị trả về.
  • > Liệt kê các module triển khai một behaviour hoặc protocol trước khi thêm callback.
  • > Lần theo một yêu cầu từ controller Phoenix tới tầng Ecto.

Chi tiết engine

  • > Hỗ trợ Elixir bao quát các tệp `.ex` và `.exs`. `alias`, `import`, `require` và `use` ghi lại import.
  • > `use GenServer` và các behaviour OTP và framework khác trong danh sách, `@behaviour` và `defimpl` ghi lại quan hệ triển khai.
  • > Các thuộc tính dành riêng như `@spec` và `@impl` chú thích cho hàm kế tiếp; literal `%Struct{}` được tính là khởi tạo.

Điểm khởi đầu MCP hữu ích

  • find_symbol

    Dùng cho hàm context hoặc module khi bạn cần định nghĩa và nơi gọi; các preset cấu trúc không chọn được dạng `def` có tên.

  • dependency_search

    Dùng duyệt theo chiều vào để thấy module nào triển khai một behaviour hoặc protocol.

  • get_task_context

    Dùng cho prompt như "lần theo một yêu cầu thanh toán từ controller tới cơ sở dữ liệu".