# Scala บน Maguyva: กราฟโค้ดสำหรับเซอร์วิส JVM และ Spark

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

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 รองรับ Scala ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตาม trait ออบเจกต์ เคสคลาส และการเรียกที่มีไทป์ในโค้ด JVM และ Spark ได้

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

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

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

- เซอร์วิส JVM ที่เขียนด้วย Scala ซึ่ง trait ออบเจกต์คู่ และเคสคลาส กระจายแนวคิดเดียวไปหลายไฟล์
- งาน Spark และวิศวกรรมข้อมูลที่เอเจนต์ต้องอ่านควบคู่กับไลบรารีที่ใช้ร่วมกันซึ่งงานเหล่านั้นเรียก
- รีโพซิทอรีที่ผสม Scala และ Java ซึ่งเอเจนต์ต้องค้นหาเหมือนเป็นโค้ดเบสเดียว

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

- ค้นหาผู้เรียกทั้งหมดของเมธอดในเซอร์วิสก่อนเปลี่ยนซิกเนเจอร์
- แสดงรายการคลาสและออบเจกต์ที่ขยาย trait ก่อนเพิ่มสมาชิกแบบนามธรรม
- ติดตามว่าคำขอเดินทางจากเส้นทาง HTTP ผ่านเซอร์วิสไปยังเลเยอร์ข้อมูลอย่างไร

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

ใน Scala ชื่อเดียวแบกภาระไว้มาก trait ออบเจกต์คู่ของมัน และเคสคลาสอาจใช้แนวคิดเดียวกัน การจับคู่รูปแบบผูกชื่อใหม่ภายในอนุประโยค `case` และเมธอดที่ถูกเรียกโดยไม่มีรีซีฟเวอร์ภายในคลาสก็คือการเรียกบน `this` จริง ๆ เอเจนต์ที่อ่านไฟล์ทีละไฟล์จะเห็นชื่อ แต่ไม่เห็นว่าชื่อเหล่านั้นรีโซลฟ์ไปยังอะไร

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

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

Maguyva ครอบคลุมไฟล์ `.scala` และ `.sc` คลาส ออบเจกต์ และ trait ถูกดึงออกมาเป็นไทป์ และพรีเซ็ต `functions` ใน `structural_search` ครอบคลุมการประกาศและนิยาม `def` รวมถึงแลมบ์ดา ซิกเนเจอร์บันทึกพารามิเตอร์แบบซ้ำ (`*`) และคำนำหน้า `_root_` จะถูกตัดออกจากการอิมพอร์ต

ความสัมพันธ์การเรียกเก็บชื่อที่ระบุคลาสไว้ และการเรียกที่ไม่มีรีซีฟเวอร์ภายในคลาสจะถูกรีโซลฟ์ไปยังเมธอดของคลาสนั้นเอง การระบุชนิดของรีซีฟเวอร์ติดตามพารามิเตอร์ พารามิเตอร์ของคลาส นิยาม `val` และ `var` รูปแบบที่มีไทป์และรูปแบบเคสคลาสในอนุประโยค `case` ไทป์ที่คืนกลับของเมธอดในคลาส ออบเจกต์ และ trait นามแฝงไทป์ และอนุประโยค `extends` ส่วน `new` บนไทป์ที่ขึ้นต้นด้วยตัวพิมพ์ใหญ่นับเป็นการสร้างอินสแตนซ์

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

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

- "ใครเรียก `PaymentService.capture` และเรียกจากเส้นทางไหนบ้าง" (`find_symbol` จากนั้น `dependency_search` ทิศทางขาเข้า)
- "คลาสและออบเจกต์ใดบ้างที่ขยาย `EventHandler`" (`dependency_search`)
- "ติดตามว่าอีเวนต์คำสั่งซื้อไปถึงตัวเขียนบัญชีแยกประเภทได้อย่างไร" (`get_task_context`)

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

- ชื่อจากไลบรารีมาตรฐานประมาณ 320 ชื่อถูกกรองออกจากความสัมพันธ์ ได้แก่การดำเนินการกับคอลเลกชันอย่าง `map`, `flatMap` และ `foldLeft` และตัวช่วย `Option`, `Either`, `Try`, `Future` และ `Predef` การเรียกบน `this` หรือบนค่าที่ไทป์รีโซลฟ์ไปยังคลาสหนึ่งของคุณ จะถูกเก็บไว้แม้ชื่อจะอยู่ในรายการนั้น หากยังดูเหมือนผู้เรียกหายไป ให้ใช้ `text_pattern_search`
- พารามิเตอร์ไทป์สั้น ๆ อย่าง `A`, `F` และ `CC` และไทป์รากอย่าง `Any`, `Unit` และ `Nothing` ถูกกรองออกจากการอ้างอิงไทป์

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

เชื่อมต่อรีโพซิทอรีด้วย[คู่มือเริ่มต้นใช้งาน](/th/docs/quickstart) แล้วดูตารางการรองรับได้ที่[หน้าความเข้ากันได้](/th/docs/compatibility) สำหรับโค้ดเบส JVM แบบผสม ให้อ่าน[คู่มือภาษา Java](/th/languages/java) และ[คู่มือภาษา Kotlin](/th/languages/kotlin) ด้วย

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

- การรองรับ Scala ครอบคลุมไฟล์ `.scala` และ `.sc` คลาส ออบเจกต์ และ trait เป็นไทป์ การเรียกที่ไม่มีรีซีฟเวอร์ภายในคลาสจะถูกรีโซลฟ์ไปยังเมธอดของคลาสนั้นเอง
- การระบุไทป์ของรีซีฟเวอร์ติดตามพารามิเตอร์ พารามิเตอร์ของคลาส นิยาม `val` และ `var` รูปแบบ `case` ไทป์ที่คืนกลับของเมธอด และอนุประโยค `extends`
- การเรียกเก็บชื่อที่ระบุคลาสไว้ `new` นับเป็นการสร้างอินสแตนซ์ และชื่อจากไลบรารีมาตรฐานประมาณ 320 ชื่อถูกกรองออกจากความสัมพันธ์

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

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