# Pascal และ Delphi บน Maguyva: กราฟยูนิตและคลาส

Canonical source: https://maguyva.ai/th/languages/pascal

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 รองรับยูนิต Pascal และ Delphi ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ทำแผนที่อนุประโยค uses คลาส และโพรซีเยอร์ได้ก่อนแก้ไข

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

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

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

- ทีมที่ดูแลแอปพลิเคชัน Delphi หรือ Lazarus/Free Pascal ซึ่งผู้เขียนดั้งเดิมจากไปนานแล้ว
- โค้ดเบส Object Pascal ที่มีลำดับชั้นคลาสลึก อินเทอร์เฟซ และยูนิตที่ใช้ร่วมกันขนาดใหญ่
- โปรเจกต์ปรับปรุงให้ทันสมัยหรือย้ายแพลตฟอร์ม ซึ่งผลงานชิ้นแรกคือแผนที่ของยูนิตและการพึ่งพา

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

- แสดงรายการทุกยูนิตที่ระบุยูนิตที่ใช้ร่วมกันไว้ในอนุประโยค `uses` ก่อนแก้ไขยูนิตนั้น
- หาคลาสที่สืบทอดจากฟอร์มฐานหรือคอมโพเนนต์ฐาน และเมธอดที่คลาสเหล่านั้น override
- ติดตามโพรซีเยอร์ที่เรียกรูทีนหนึ่ง ก่อนเปลี่ยนพารามิเตอร์ของรูทีนนั้น

## ทำไมโค้ดเบส Pascal ต้องมีแผนที่ก่อน

แอปพลิเคชัน Delphi และ Free Pascal มักเติบโตรอบยูนิตใหญ่ไม่กี่ยูนิตที่ทุกส่วนใช้งาน ฟอร์มสืบทอดจากฟอร์มฐาน คอมโพเนนต์สืบทอดจากคอมโพเนนต์ฐาน และกฎทางธุรกิจอยู่ในโพรซีเยอร์ที่หน้าจอหลายสิบหน้าเรียกใช้ โค้ดอ่านง่ายเมื่ออ่านทีละไฟล์ แต่การเปลี่ยนแปลงมักผิดพลาดที่การพึ่งพา

Maguyva ให้โครงสร้างยูนิตและคลาสกับเอเจนต์ก่อน เพื่อให้บอกได้ว่าการเปลี่ยนแปลงแตะอะไรบ้างก่อนจะเขียนอะไรลงไป

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

Maguyva ครอบคลุมยูนิตซอร์ส `.pas` และ `.pp` นิยามโพรซีเยอร์และฟังก์ชันถูกดึงออกมาเป็นสัญลักษณ์ที่เรียกใช้ได้ และคีย์เวิร์ด `procedure`, `function`, `var` และ `const` จะถูกตัดออกจากชื่อนิยาม คลาสและอินเทอร์เฟซเลือกเป็นนิยามชนิดข้อมูลในการค้นหาเชิงโครงสร้างได้

การนำเข้ามาจากอนุประโยค `uses` โดยตัดคีย์เวิร์ดออกเพื่อให้กราฟเก็บชื่อยูนิต การเรียกถูกทำให้เป็นมาตรฐานโดยตัดพรีฟิกซ์ของสมาชิก อาร์กิวเมนต์ และวงเล็บด้านนอกออก การเรียกที่เขียนว่า `Self.Save(x)` จึงถูกเก็บเป็น `Save`

กราฟบันทึกการเรียก การสืบทอด การอิมพลีเมนต์อินเทอร์เฟซ การ override การสร้างอินสแตนซ์ การอ้างอิงชนิดข้อมูล การอ่านและการเขียน และเส้นเชื่อมการโยนและการจัดการเอกซ์เซปชัน รูทีนไลบรารีรันไทม์ราว 107 รายการ (`WriteLn`, `ReadLn`, `Inc`, `Dec`, `Ord` และอื่น ๆ ทำนองเดียวกัน) ถูกกรองออกจากความสัมพันธ์

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

- "ยูนิตใดใช้ `DataModuleMain` และเรียกอะไรจากยูนิตนั้น" (`dependency_search` ทิศทางขาเข้า)
- "ฟอร์มใดสืบทอดจาก `TBaseEditForm` และ override เมธอดใดบ้าง" (`find_symbol` แล้วตามด้วย `dependency_search`)
- "อธิบายว่าใบแจ้งหนี้ถูกบันทึกอย่างไร ตั้งแต่ตัวจัดการปุ่มไปจนถึงยูนิตฐานข้อมูล" (`get_task_context`)

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

- มีเพียง `.pas` และ `.pp` ที่ถูกจับคู่กับ Pascal ไฟล์โปรเจกต์และฟอร์มของ Delphi เช่น `.dpr` และ `.dfm` ไม่อยู่ในรายการนามสกุลไฟล์ เลย์เอาต์ฟอร์มและการเชื่อมโยงโปรเจกต์จึงอยู่นอกกราฟ
- เมธอดใช้ไวยากรณ์เดียวกับโพรซีเยอร์อิสระ พรีเซ็ต `methods` ใน `structural_search` จึงไม่เลือกอะไรเลย ให้ใช้พรีเซ็ต `functions`
- การเรียกรูทีนไลบรารีรันไทม์ที่ถูกกรองจะไม่ปรากฏเป็นเส้นเชื่อมในกราฟ ใช้ `text_pattern_search` สำหรับกรณีเหล่านี้

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

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

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

- การรองรับ Pascal ครอบคลุมยูนิต `.pas` และ `.pp` ไฟล์โปรเจกต์และฟอร์มของ Delphi เช่น `.dpr` และ `.dfm` ไม่อยู่ในรายการนามสกุลไฟล์
- อนุประโยค `uses` กลายเป็นความสัมพันธ์การนำเข้า และการเรียกถูกทำให้เป็นมาตรฐานโดยตัดพรีฟิกซ์ของสมาชิก อาร์กิวเมนต์ และวงเล็บด้านนอกออก
- รูทีนไลบรารีรันไทม์ราว 107 รายการ เช่น `WriteLn`, `Inc` และ `Ord` ถูกกรองออกจากความสัมพันธ์ เพื่อให้โค้ดแอปโดดเด่นขึ้นมา

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

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