Chuyển tới nội dung
cd /languages
  • Kịch bản nhúng
  • Lập trình
  • Hỗ trợ AST và symbol

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

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.

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, sau đó xem ma trận hỗ trợ trên trang tương thích. Với các engine nhúng Lua vào mã native, hãy đọc thêm hướng dẫn C.

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

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