# Scala trên Maguyva: đồ thị mã cho dịch vụ JVM và Spark

Canonical source: https://maguyva.ai/vi/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 hỗ trợ Scala với AST, ký hiệu và đồ thị, để agent AI có thể lần theo trait, object, case class và lời gọi có kiểu trong mã JVM và Spark.

## Tổng quan hỗ trợ

- Cấp độ: Hỗ trợ AST và symbol
- Lập trình
- Phần mở rộng: .sc, .scala
- Phân tích AST thật cho tìm kiếm nhận biết cú pháp và context cấu trúc.
- Các symbol có tên cung cấp dữ liệu cho tra cứu ngữ nghĩa và tham chiếu chéo. Điều hướng graph khả dụng khi bật trích xuất quan hệ.
- Ngôn ngữ này đóng góp symbol và quan hệ cho tìm kiếm nhận biết graph; các loại edge được hỗ trợ thay đổi theo cấu trúc riêng của ngôn ngữ.
- Cả phân tích AST và trích xuất symbol đều khả dụng.

## Phù hợp nhất

- Dịch vụ JVM viết bằng Scala, nơi trait, companion object và case class trải một khái niệm ra nhiều tệp.
- Job Spark và kỹ thuật dữ liệu mà agent cần đọc cùng các thư viện dùng chung chúng gọi tới.
- Kho mã trộn Scala và Java mà agent cần tìm kiếm như một codebase duy nhất.

## Workflow agent

- Tìm mọi nơi gọi một phương thức của service trước khi đổi chữ ký của nó.
- Liệt kê các lớp và object mở rộng một trait trước khi thêm thành viên trừu tượng.
- Lần theo cách một yêu cầu đi từ route HTTP qua các service tới tầng dữ liệu.

## Scala làm khó các công cụ AI hời hợt ở đâu

Trong Scala, một cái tên gánh rất nhiều việc. Một trait, companion object của nó và một case class có thể cùng chia sẻ một khái niệm. Khớp mẫu gắn tên mới bên trong các mệnh đề `case`, và một phương thức được gọi không có receiver trong lớp thực chất là lời gọi trên `this`. Agent đọc từng tệp một sẽ thấy các tên, nhưng không thấy chúng được phân giải tới đâu.

Maguyva phân giải nhiều hơn ngay khi lập chỉ mục, để khi agent hỏi ai gọi một phương thức, nó nhận được câu trả lời có thể hành động ngay.

## Maguyva trích xuất gì từ Scala

Maguyva bao quát các tệp `.scala` và `.sc`. Lớp, object và trait được trích xuất thành kiểu, còn preset `functions` trong `structural_search` bao gồm khai báo và định nghĩa `def` cùng lambda. Chữ ký ghi lại tham số lặp (`*`), và tiền tố `_root_` bị loại khỏi import.

Quan hệ lời gọi giữ lại tên có kèm lớp, và lời gọi không có receiver bên trong lớp được phân giải tới phương thức của chính lớp đó. Việc gán kiểu cho receiver theo dõi tham số, tham số lớp, định nghĩa `val` và `var`, mẫu có kiểu và mẫu case class trong các mệnh đề `case`, kiểu trả về của phương thức trong lớp, object và trait, bí danh kiểu và các mệnh đề `extends`. `new` trên một kiểu viết hoa được tính là khởi tạo.

Không có loại quan hệ nào bị đánh dấu là không áp dụng cho Scala, nên đồ thị còn ghi lại kế thừa, ghi đè, tham chiếu kiểu, thao tác đọc và ghi, luồng điều khiển và các cạnh ngoại lệ.

## Ví dụ prompt cho agent

- "Ai gọi `PaymentService.capture`, và từ những route nào?" (`find_symbol`, sau đó `dependency_search` theo chiều vào)
- "Những lớp và object nào mở rộng `EventHandler`?" (`dependency_search`)
- "Lần theo cách một sự kiện đơn hàng tới được bộ ghi sổ cái." (`get_task_context`)

## Giới hạn đã biết

- Khoảng 320 tên thư viện chuẩn bị lọc khỏi quan hệ: các thao tác tập hợp như `map`, `flatMap` và `foldLeft`, cùng các helper `Option`, `Either`, `Try`, `Future` và `Predef`. Lời gọi trên `this`, hoặc trên một giá trị có kiểu được phân giải tới một lớp của bạn, vẫn được giữ lại dù tên nằm trong danh sách đó. Nếu vẫn thấy thiếu một nơi gọi, hãy dùng `text_pattern_search`.
- Tham số kiểu ngắn như `A`, `F` và `CC` cùng các kiểu gốc như `Any`, `Unit` và `Nothing` bị lọc khỏi tham chiếu kiểu.

## Bước tiếp theo

Kết nối một kho mã bằng [hướng dẫn bắt đầu nhanh](/vi/docs/quickstart), sau đó xem ma trận hỗ trợ trên [trang tương thích](/vi/docs/compatibility). Với codebase JVM hỗn hợp, hãy đọc thêm [hướng dẫn Java](/vi/languages/java) và [hướng dẫn Kotlin](/vi/languages/kotlin).

## Chi tiết engine

- Hỗ trợ Scala bao quát các tệp `.scala` và `.sc`. Lớp, object và trait là kiểu; lời gọi không có receiver bên trong lớp được phân giải tới phương thức của chính lớp đó.
- Việc gán kiểu cho receiver theo dõi tham số, tham số lớp, định nghĩa `val` và `var`, mẫu `case`, kiểu trả về của phương thức và mệnh đề `extends`.
- Lời gọi giữ lại tên có kèm lớp, `new` được tính là khởi tạo, và khoảng 320 tên thư viện chuẩn bị lọc khỏi quan hệ.

## Điểm khởi đầu MCP hữu ích

- `find_symbol`: Dùng cho trait, object hoặc phương thức của service khi bạn cần định nghĩa và các tham chiếu.
- `dependency_search`: Dùng duyệt theo chiều vào trên một trait hoặc phương thức để thấy nơi triển khai và nơi gọi trước khi đổi chữ ký.
- `get_task_context`: Dùng cho prompt như "lần theo cách một sự kiện đơn hàng tới được bộ ghi sổ cái".
