# Lua บน Maguyva: กราฟโค้ดสำหรับเกม ปลั๊กอิน และ OpenResty

Canonical source: https://maguyva.ai/th/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 รองรับ Lua ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตามโมดูล เมธอดแบบโคลอน คลาสที่สร้างจากเมทาเทเบิล และลำดับ require ในโค้ด Lua ได้

## ภาพรวมการรองรับ

- ระดับ: รองรับ AST และสัญลักษณ์
- การเขียนโปรแกรม
- นามสกุลไฟล์: .lua
- การแยกวิเคราะห์ AST จริงสำหรับการค้นหาที่รู้จักไวยากรณ์และบริบทเชิงโครงสร้าง
- สัญลักษณ์ที่มีชื่อป้อนข้อมูลให้การค้นหาเชิงความหมายและการอ้างอิงไขว้ การนำทางกราฟจะใช้งานได้เมื่อเปิดใช้การสกัดความสัมพันธ์
- ภาษานี้ส่งสัญลักษณ์และความสัมพันธ์ไปยังการค้นหาแบบรู้บริบทกราฟ โดยประเภทเอดจ์ที่รองรับจะแตกต่างกันตามโครงสร้างเฉพาะของภาษา
- รองรับทั้งการแยกวิเคราะห์ AST และการสกัดสัญลักษณ์

## เหมาะที่สุดสำหรับ

- โค้ดเกมและสคริปต์เอนจินที่โมดูล คลาสแบบตาราง และตัวจัดการอีเวนต์เรียกกัน
- ปลั๊กอิน Neovim และการตั้งค่าเอดิเตอร์ที่แบ่งเป็นหลายโมดูลซึ่งโหลดด้วย require
- OpenResty และการใช้ Lua แบบฝังตัวอื่น ๆ ที่ตัวจัดการคำขออยู่คู่กับโมดูลยูทิลิตีที่ใช้ร่วมกัน

## เวิร์กโฟลว์ของเอเจนต์

- ค้นหาผู้เรียกทั้งหมดของฟังก์ชันในโมดูลก่อนเปลี่ยนอาร์กิวเมนต์
- ติดตามว่าโมดูลใดโหลดยูทิลิตีที่ใช้ร่วมกันด้วย require ก่อนย้ายมัน
- ทำแผนที่ตารางที่สืบทอดจากคลาสฐานผ่าน `setmetatable`

## จุดที่ Lua ทำให้เครื่องมือ AI แบบผิวเผินสะดุด

Lua ไม่มีคีย์เวิร์ดสำหรับคลาส ออบเจกต์คือตาราง เมธอดคือฟังก์ชันที่เก็บไว้ในตาราง และการสืบทอดคือการเรียก `setmetatable` โมดูลคือสิ่งที่ `require` คืนกลับมา โครงสร้างมีอยู่จริง แต่อยู่ในธรรมเนียมที่การค้นหาข้อความไม่เข้าใจ

Maguyva อ่านธรรมเนียมเหล่านั้นเป็นโครงสร้าง เพื่อให้เอเจนต์ถามได้ว่าใครเรียกเมธอดหนึ่ง หรือตารางใดขยายฐานหนึ่ง แล้วได้คำตอบโดยตรง

## Maguyva ดึงอะไรจาก Lua ได้บ้าง

Maguyva ครอบคลุมไฟล์ `.lua` การประกาศฟังก์ชัน นิยาม `local function` และนิพจน์ฟังก์ชันถูกดึงออกมา และเมธอดแบบโคลอนอย่าง `function Account:deposit()` จะถูกผูกกับตารางเจ้าของคือ `Account` ลำดับเมธอดถูกติดตามทีละการเรียก และการเรียกบน `self` ยังคงผูกอยู่กับออบเจกต์ที่ล้อมรอบ

ธรรมเนียมของ Lua กลายเป็นความสัมพันธ์ดังนี้

- `require`, `dofile` และ `loadfile` บันทึกการอิมพอร์ต
- การเรียก `setmetatable` ระดับโมดูลบันทึกการสืบทอด
- `ClassName:new()`, `ClassName.new()` และ `setmetatable({...}, ClassName)` นับเป็นการสร้างอินสแตนซ์
- `error()` บันทึกการโยน และ `pcall` กับ `xpcall` บันทึกการจับ

กราฟยังบันทึกการอ่านและเขียน และโฟลว์การควบคุม

## ตัวอย่างพรอมต์สำหรับเอเจนต์

- "ใครเรียก `Inventory:addItem` และเรียกจากสคริปต์ไหนบ้าง" (`find_symbol` จากนั้น `dependency_search` ทิศทางขาเข้า)
- "โมดูลใดบ้างที่โหลด `util.http` ด้วย require" (`dependency_search`)
- "ติดตามว่าเกิดอะไรขึ้นเมื่อผู้เล่นได้รับความเสียหาย" (`get_task_context`)

## ข้อจำกัดที่ทราบ

- ชื่อประมาณ 150 ชื่อถูกกรองออกจากความสัมพันธ์ ได้แก่ไลบรารีมาตรฐานของ Lua (`string`, `table`, `math`, `io`, `os`, `coroutine`, `debug` และ `utf8`) รวมถึง API `vim.*` ของ Neovim และ `ngx.*` ของ OpenResty การเรียก API เหล่านี้ไม่ใช่เส้นเชื่อมในกราฟ ใช้ `text_pattern_search` เพื่อค้นหา
- เนื่องจากโมดูลและคลาสสร้างจากการเรียกและตารางทั่วไป พรีเซ็ต `classes` และ `imports` ใน `structural_search` จึงไม่เลือกอะไรเลยสำหรับ Lua ให้ใช้ `find_symbol` หรือ `text_pattern_search` แทน
- Lua ไม่มีอินเทอร์เฟซหรือคำอธิบายประกอบไทป์ ความสัมพันธ์การอิมพลีเมนต์อินเทอร์เฟซและการอ้างอิงไทป์จึงถูกทำเครื่องหมายว่าไม่เกี่ยวข้อง

## ขั้นตอนถัดไป

เชื่อมต่อรีโพซิทอรีด้วย[คู่มือเริ่มต้นใช้งาน](/th/docs/quickstart) แล้วดูตารางการรองรับได้ที่[หน้าความเข้ากันได้](/th/docs/compatibility) สำหรับเอนจินที่ฝัง Lua ไว้ในโค้ดเนทีฟ ให้อ่าน[คู่มือภาษา C](/th/languages/c) ด้วย

## รายละเอียดเอนจิน

- การรองรับ Lua ครอบคลุมไฟล์ `.lua` เมธอดแบบโคลอนอย่าง `function Account:deposit()` จะถูกผูกกับตารางเจ้าของ
- `require`, `dofile` และ `loadfile` บันทึกการอิมพอร์ต `setmetatable` ระดับโมดูลบันทึกการสืบทอด และ `ClassName:new()` นับเป็นการสร้างอินสแตนซ์
- `error()` บันทึกการโยนและ `pcall` บันทึกการจับ ส่วนชื่อจากไลบรารีมาตรฐาน `vim.*` และ `ngx.*` ประมาณ 150 ชื่อถูกกรองออก

## จุดเริ่มต้น MCP ที่มีประโยชน์

- `find_symbol`: ใช้กับฟังก์ชันในโมดูลหรือเมธอดแบบโคลอนเมื่อต้องการนิยามและผู้เรียก
- `dependency_search`: ใช้การท่องกราฟขาเข้าเพื่อดูว่าไฟล์ใดโหลดโมดูลที่ใช้ร่วมกันด้วย require ก่อนย้ายมัน
- `text_pattern_search`: ใช้กับการเรียก `vim.*`, `ngx.*` หรือไลบรารีมาตรฐานที่ถูกกรองออกจากกราฟ
