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

Canonical source: https://maguyva.ai/vi/languages/elixir

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

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.

## Tổng quan hỗ trợ

- Cấp độ: Hỗ trợ AST và symbol
- Lập trình
- Phần mở rộng: .ex, .exs
- Phân tích AST thật cho tìm kiếm nhận biết cú pháp và context cấu trúc.
- Các symbol có tên cung cấp dữ liệu cho tra cứu ngữ nghĩa và tham chiếu chéo. Điều hướng graph khả dụng khi bật trích xuất quan hệ.
- Ngôn ngữ này đóng góp symbol và quan hệ cho tìm kiếm nhận biết graph; các loại edge được hỗ trợ thay đổi theo cấu trúc riêng của ngôn ngữ.
- Cả phân tích AST và trích xuất symbol đều khả dụng.

## 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.

## 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](/vi/docs/quickstart), sau đó xem ma trận hỗ trợ trên [trang tương thích](/vi/docs/compatibility). Với các codebase hàm khác, hãy đọc [hướng dẫn Haskell](/vi/languages/haskell).

## 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".
