# MaguyvaのScala対応: JVMサービスとSparkのコードグラフ

Canonical source: https://maguyva.ai/ja/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はAST、シンボル、グラフでScalaに対応しています。AIエージェントはJVMとSparkのコード全体で、トレイト、オブジェクト、ケースクラス、型付きの呼び出しをたどれます。

## 対応状況スナップショット

- 対応レベル: AST・シンボル対応
- プログラミング
- 拡張子: .sc, .scala
- 構文を考慮した検索と構造コンテキストのための実際のAST解析。
- 名前付きシンボルはセマンティック検索と相互参照に利用されます。関係抽出が有効な場合は、グラフナビゲーションも利用できます。
- この言語は、グラフを考慮した検索にシンボルと関係情報を提供します。対応するエッジの種類は、その言語固有の構文要素によって異なります。
- AST解析とシンボル抽出の両方に対応しています。

## 最適な用途

- トレイト、コンパニオンオブジェクト、ケースクラスが1つの概念を多くのファイルに分散させる、Scalaで書かれたJVMサービス。
- エージェントが、呼び出している共有ライブラリと並べて読む必要があるSparkやデータエンジニアリングのジョブ。
- エージェントが1つのコードベースとして検索する必要がある、ScalaとJavaの混在したリポジトリ。

## エージェントワークフロー

- サービスメソッドのシグネチャを変更する前に、その呼び出し元をすべて見つける。
- 抽象メンバーを追加する前に、トレイトを拡張しているクラスとオブジェクトを一覧にする。
- リクエストがHTTPルートからサービスを経てデータ層に至るまでの流れを追跡する。

## Scalaが浅いAIツールをつまずかせるところ

Scalaでは1つの名前が多くを担います。トレイト、そのコンパニオンオブジェクト、ケースクラスが1つの概念を共有できます。パターンマッチは `case` 句の中で新しい名前を束縛し、クラス内でレシーバーなしに呼ばれたメソッドは `this` への呼び出しです。ファイルを1つずつ読むエージェントには、名前は見えても、それが何に解決されるかは見えません。

Maguyvaはインデックス作成時にその多くを解決するため、エージェントがメソッドの呼び出し元を尋ねると、そのまま行動に移せる答えが返ってきます。

## MaguyvaがScalaで抽出するもの

Maguyvaは `.scala` と `.sc` ファイルに対応しています。クラス、オブジェクト、トレイトは型として抽出され、`structural_search` の `functions` プリセットは `def` の宣言と定義、そしてラムダを対象にします。シグネチャには可変長（`*`）パラメーターが記録され、インポートからは `_root_` プレフィックスが取り除かれます。

呼び出しの関係はクラス修飾名を保持し、クラス内のレシーバーなしの呼び出しはそのクラス自身のメソッドに解決されます。レシーバーの型付けは、パラメーター、クラスパラメーター、`val` と `var` の定義、`case` 句の中の型付きパターンとケースクラスパターン、クラス、オブジェクト、トレイトのメソッドの戻り値の型、型エイリアス、そして `extends` 句をたどります。大文字で始まる型に対する `new` はインスタンス化として数えられます。

Scalaでは適用対象外とされる関係性の種類がないため、グラフには継承、オーバーライド、型参照、読み取りと書き込み、制御フロー、例外のエッジも記録されます。

## エージェントへのプロンプト例

- 「`PaymentService.capture` を呼び出しているのは誰で、どのルートからか？」（`find_symbol`、次に `dependency_search` の incoming）
- 「`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` のようなルート型は、型参照から除外されます。

## 次のステップ

[クイックスタート](/ja/docs/quickstart)でリポジトリを接続し、[互換性ページ](/ja/docs/compatibility)で対応マトリクスを確認してください。JVMの混在したコードベースについては、[Javaガイド](/ja/languages/java)と[Kotlinガイド](/ja/languages/kotlin)もご覧ください。

## エンジンの詳細

- Scalaの対応は `.scala` と `.sc` を含みます。クラス、オブジェクト、トレイトは型で、クラス内のレシーバーなしの呼び出しはそのクラス自身のメソッドに解決されます。
- レシーバーの型付けは、パラメーター、クラスパラメーター、`val` と `var` の定義、`case` パターン、メソッドの戻り値の型、`extends` 句をたどります。
- 呼び出しはクラス修飾名を保持し、`new` はインスタンス化として数えられ、約320個の標準ライブラリの名前は関係性から除外されます。

## 役立つMCPエントリーポイント

- `find_symbol`: 定義と参照が必要なときに、トレイト、オブジェクト、サービスメソッドで使ってください。
- `dependency_search`: シグネチャを変更する前に、トレイトやメソッドに対してincomingのトラバーサルを使い、実装クラスと呼び出し元を確認してください。
- `get_task_context`: 「注文イベントが台帳の書き込み処理に届くまでの流れを追跡して」のようなプロンプトに使ってください。
