ข้ามไปที่เนื้อหา
cd /languages
  • BEAM แบบทำงานพร้อมกัน
  • การเขียนโปรแกรม
  • รองรับ AST และสัญลักษณ์

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

Maguyva รองรับ Elixir ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตามโมดูล behaviour โปรโตคอล และ struct ในโค้ด Phoenix และ OTP ได้

จุดที่ 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 ไม่มีการสืบทอดคลาส ความสัมพันธ์การสืบทอดจึงถูกทำเครื่องหมายว่าไม่เกี่ยวข้อง

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

เชื่อมต่อรีโพซิทอรีด้วยคู่มือเริ่มต้นใช้งาน แล้วดูตารางการรองรับได้ที่หน้าความเข้ากันได้ สำหรับโค้ดเบสเชิงฟังก์ชันอื่น ๆ ให้อ่านคู่มือภาษา Haskell

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

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

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

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

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

  • > การรองรับ 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

    ใช้กับพรอมต์อย่าง "ติดตามคำขอชำระเงินจากคอนโทรลเลอร์ไปจนถึงฐานข้อมูล"

คู่มือที่เกี่ยวข้อง

ส่วนอื่นของรีโพที่เกี่ยวข้อง

ดูคู่มือทั้งหมด