# Elixir บน Maguyva: กราฟโค้ดสำหรับแอป Phoenix และ OTP

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

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

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

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

- แอป Phoenix ที่คอนโทรลเลอร์ LiveView คอนเท็กซ์ และสคีมา Ecto เรียกกันข้ามหลายโมดูล
- ระบบ OTP ที่สร้างจาก GenServer ซูเปอร์ไวเซอร์ และทาสก์
- ไลบรารีและโปรเจกต์ umbrella ที่โปรโตคอลถูกอิมพลีเมนต์ให้หลายไทป์

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

- ค้นหาผู้เรียกทั้งหมดของฟังก์ชันคอนเท็กซ์ก่อนเปลี่ยนรูปแบบค่าที่คืนกลับ
- แสดงรายการโมดูลที่อิมพลีเมนต์ behaviour หรือโปรโตคอลก่อนเพิ่มคอลแบ็ก
- ติดตามคำขอจากคอนโทรลเลอร์ของ Phoenix ไปจนถึงเลเยอร์ Ecto

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

เกือบทุกอย่างใน Elixir คือการเรียกมาโคร `defmodule`, `def`, `use`, `alias` และ `@impl` ล้วนถูกแยกวิเคราะห์เป็นการเรียก ส่วน `use GenServer` นำพฤติกรรมที่ไม่เคยปรากฏในไฟล์เข้ามา เครื่องมือที่เห็นเพียงไวยากรณ์การเรียกจึงแยกไม่ออกว่าอะไรคือนิยามหรือการพึ่งพา หรืออะไรคือคอลแบ็กของ GenServer กับฟังก์ชันตัวช่วย

Maguyva แปลงมาโครเหล่านั้นเป็นความสัมพันธ์ เพื่อให้เอเจนต์เห็นว่าโมดูลใดอิมพลีเมนต์ behaviour และใครเรียกฟังก์ชันคอนเท็กซ์

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

Maguyva ครอบคลุมไฟล์ `.ex` และ `.exs` มาโครของ Elixir กลายเป็นความสัมพันธ์ดังนี้

- `alias`, `import` และ `require` บันทึกการอิมพอร์ต
- `use` บันทึกการอิมพอร์ต สำหรับ behaviour ของ OTP และเฟรมเวิร์กอย่าง `GenServer`, `Supervisor`, `Agent`, `Task`, `Phoenix.Controller`, `Phoenix.LiveView` และ `Ecto.Schema` ยังบันทึกด้วยว่าโมดูลนั้นอิมพลีเมนต์ behaviour ดังกล่าว
- แอตทริบิวต์ `@behaviour` และบล็อก `defimpl` บันทึกการอิมพลีเมนต์ behaviour หรือโปรโตคอล
- แอตทริบิวต์โมดูลที่สงวนไว้อย่าง `@doc`, `@spec`, `@impl` และ `@callback` ถูกบันทึกเป็นคำอธิบายประกอบของฟังก์ชันที่ตามมา แอตทริบิวต์ที่เก็บค่า เช่น `@timeout 5_000` จะไม่ถูกบันทึก
- ลิเทอรัล struct `%User{}` นับเป็นการสร้างอินสแตนซ์ `raise` บันทึกการโยน และ `rescue` กับ `catch` บันทึกการจับ

มาโครของภาษาอย่าง `def`, `defp`, `defmodule`, `case` และ `with` ถูกกรองออกจากการเรียก กราฟการเรียกจึงแสดงฟังก์ชันของคุณเอง

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

- "ใครเรียก `Accounts.register_user` และเรียกจากคอนโทรลเลอร์ไหนบ้าง" (`find_symbol` จากนั้น `dependency_search` ทิศทางขาเข้า)
- "โมดูลใดบ้างที่อิมพลีเมนต์ `GenServer`" (`dependency_search`)
- "ติดตามคำขอชำระเงินจากคอนโทรลเลอร์ไปจนถึงฐานข้อมูล" (`get_task_context`)

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

- รูปแบบแบบมีชื่อ `def`, `defmodule`, `alias` และ `import` เป็นโหนดการเรียกในไวยากรณ์ ดังนั้นใน `structural_search` มีเพียงพรีเซ็ต `functions` ที่ให้ผลลัพธ์ และเฉพาะฟังก์ชัน `fn` แบบไม่มีชื่อเท่านั้น ใช้ `find_symbol` สำหรับฟังก์ชันและโมดูลแบบมีชื่อ
- การเรียกไลบรารีมาตรฐานประมาณ 55 รายการ เช่น `IO.puts`, `String.*`, `Enum.take` และ `Process.*` ถูกกรองออกจากความสัมพันธ์ ใช้ `text_pattern_search` สำหรับสิ่งเหล่านี้
- Elixir ไม่มีการสืบทอดคลาส ความสัมพันธ์การสืบทอดจึงถูกทำเครื่องหมายว่าไม่เกี่ยวข้อง

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

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

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

- การรองรับ Elixir ครอบคลุมไฟล์ `.ex` และ `.exs` โดย `alias`, `import`, `require` และ `use` บันทึกการอิมพอร์ต
- `use GenServer` และ behaviour อื่นของ OTP และเฟรมเวิร์กที่อยู่ในรายการ รวมถึง `@behaviour` และ `defimpl` บันทึกความสัมพันธ์การอิมพลีเมนต์
- แอตทริบิวต์ที่สงวนไว้อย่าง `@spec` และ `@impl` อธิบายประกอบฟังก์ชันถัดไป ลิเทอรัล `%Struct{}` นับเป็นการสร้างอินสแตนซ์

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

- `find_symbol`: ใช้กับฟังก์ชันคอนเท็กซ์หรือโมดูลเมื่อต้องการนิยามและผู้เรียก พรีเซ็ตเชิงโครงสร้างไม่เลือกรูปแบบ `def` แบบมีชื่อ
- `dependency_search`: ใช้การท่องกราฟขาเข้าเพื่อดูว่าโมดูลใดอิมพลีเมนต์ behaviour หรือโปรโตคอล
- `get_task_context`: ใช้กับพรอมต์อย่าง "ติดตามคำขอชำระเงินจากคอนโทรลเลอร์ไปจนถึงฐานข้อมูล"
