本文へスキップ
cd /languages
  • 型付きJVM
  • プログラミング
  • AST・シンボル対応

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

MaguyvaはAST、シンボル、グラフでScalaに対応しています。AIエージェントはJVMとSparkのコード全体で、トレイト、オブジェクト、ケースクラス、型付きの呼び出しをたどれます。

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 のようなルート型は、型参照から除外されます。

次のステップ

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

最適な用途

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

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

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

エンジンの詳細

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

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

  • find_symbol

    定義と参照が必要なときに、トレイト、オブジェクト、サービスメソッドで使ってください。

  • dependency_search

    シグネチャを変更する前に、トレイトやメソッドに対してincomingのトラバーサルを使い、実装クラスと呼び出し元を確認してください。

  • get_task_context

    「注文イベントが台帳の書き込み処理に届くまでの流れを追跡して」のようなプロンプトに使ってください。