# Lua trên Maguyva: đồ thị mã cho game, plugin và OpenResty

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

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ợ Lua với AST, ký hiệu và đồ thị, để agent AI có thể lần theo module, phương thức dấu hai chấm, lớp metatable và chuỗi require trong mã Lua.

## Tổng quan hỗ trợ

- Cấp độ: Hỗ trợ AST và symbol
- Lập trình
- Phần mở rộng: .lua
- 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

- Mã game và kịch bản engine nơi module, lớp dựa trên bảng và trình xử lý sự kiện gọi lẫn nhau.
- Plugin Neovim và cấu hình trình soạn thảo được chia thành nhiều module nạp bằng require.
- OpenResty và các cách dùng Lua nhúng khác, nơi trình xử lý yêu cầu nằm cạnh các module tiện ích dùng chung.

## Workflow agent

- Tìm mọi nơi gọi một hàm của module trước khi đổi đối số của nó.
- Lần theo những module nào nạp một tiện ích dùng chung bằng require trước khi di chuyển nó.
- Lập bản đồ những bảng kế thừa từ một lớp cơ sở thông qua `setmetatable`.

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

Lua không có từ khóa cho lớp. Đối tượng là bảng, phương thức là hàm được lưu trong bảng, và kế thừa là một lời gọi `setmetatable`. Một module là bất cứ thứ gì `require` trả về. Cấu trúc là có thật, nhưng nằm trong những quy ước mà tìm kiếm văn bản không hiểu.

Maguyva đọc các quy ước đó như cấu trúc, để agent có thể hỏi ai gọi một phương thức hoặc bảng nào mở rộng một lớp cơ sở và nhận câu trả lời trực tiếp.

## Maguyva trích xuất gì từ Lua

Maguyva bao quát các tệp `.lua`. Khai báo hàm, định nghĩa `local function` và biểu thức hàm được trích xuất, còn phương thức dấu hai chấm như `function Account:deposit()` được gán cho bảng sở hữu nó, `Account`. Chuỗi phương thức được lần theo từng lời gọi, và lời gọi trên `self` vẫn gắn với đối tượng bao quanh.

Các quy ước của Lua trở thành quan hệ như sau:

- `require`, `dofile` và `loadfile` ghi lại import.
- Lời gọi `setmetatable` ở cấp module ghi lại kế thừa.
- `ClassName:new()`, `ClassName.new()` và `setmetatable({...}, ClassName)` được tính là khởi tạo.
- `error()` ghi lại một lần ném, còn `pcall` và `xpcall` ghi lại một lần bắt.

Đồ thị còn ghi lại thao tác đọc và ghi cùng luồng điều khiển.

## Ví dụ prompt cho agent

- "Ai gọi `Inventory:addItem`, và từ những kịch bản nào?" (`find_symbol`, sau đó `dependency_search` theo chiều vào)
- "Những module nào nạp `util.http` bằng require?" (`dependency_search`)
- "Lần theo điều gì xảy ra khi người chơi nhận sát thương." (`get_task_context`)

## Giới hạn đã biết

- Khoảng 150 tên bị lọc khỏi quan hệ: thư viện chuẩn của Lua (`string`, `table`, `math`, `io`, `os`, `coroutine`, `debug` và `utf8`) cùng các API `vim.*` của Neovim và `ngx.*` của OpenResty. Lời gọi tới các API này không phải là cạnh đồ thị; dùng `text_pattern_search` để tìm chúng.
- Vì module và lớp được tạo từ lời gọi và bảng thông thường, các preset `classes` và `imports` trong `structural_search` không chọn được gì với Lua. Hãy dùng `find_symbol` hoặc `text_pattern_search` thay thế.
- Lua không có interface hay chú thích kiểu, nên các quan hệ triển khai interface và tham chiếu kiểu đượ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 engine nhúng Lua vào mã native, hãy đọc thêm [hướng dẫn C](/vi/languages/c).

## Chi tiết engine

- Hỗ trợ Lua bao quát các tệp `.lua`. Phương thức dấu hai chấm như `function Account:deposit()` được gán cho bảng sở hữu nó.
- `require`, `dofile` và `loadfile` ghi lại import, `setmetatable` ở cấp module ghi lại kế thừa, và `ClassName:new()` được tính là khởi tạo.
- `error()` ghi lại một lần ném và `pcall` ghi lại một lần bắt, còn khoảng 150 tên thư viện chuẩn, `vim.*` và `ngx.*` bị lọc.

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

- `find_symbol`: Dùng cho hàm của module hoặc phương thức dấu hai chấm khi bạn cần định nghĩa và nơi gọi.
- `dependency_search`: Dùng duyệt theo chiều vào để thấy tệp nào nạp một module dùng chung bằng require trước khi di chuyển nó.
- `text_pattern_search`: Dùng cho các lời gọi `vim.*`, `ngx.*` hoặc thư viện chuẩn bị lọc khỏi đồ thị.
