본문으로 건너뛰기
cd /languages
  • 타입 있는 JVM
  • 프로그래밍
  • AST 및 심볼 지원

Maguyva의 Scala 지원: JVM 서비스와 Spark를 위한 코드 그래프

Maguyva는 AST, 심볼, 그래프로 Scala를 지원하여, AI 에이전트가 JVM과 Spark 코드 전반에서 트레이트, 객체, 케이스 클래스, 타입이 있는 호출을 따라갈 수 있게 합니다.

Scala가 얕은 AI 도구를 넘어뜨리는 지점

Scala에서는 이름 하나가 많은 것을 담습니다. 트레이트, 그 동반 객체, 케이스 클래스가 하나의 개념을 공유할 수 있습니다. 패턴 매칭은 case 절 안에서 새 이름을 바인딩하고, 클래스 안에서 리시버 없이 호출된 메서드는 this에 대한 호출입니다. 한 번에 파일 하나씩 읽는 에이전트는 이름은 봐도 그것이 무엇으로 해석되는지는 보지 못합니다.

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 가이드도 읽어 보세요.

가장 적합한 경우

  • > 트레이트, 동반 객체, 케이스 클래스가 하나의 개념을 여러 파일에 나누어 담는, Scala로 작성된 JVM 서비스.
  • > 에이전트가 호출하는 공유 라이브러리와 함께 읽어야 하는 Spark 및 데이터 엔지니어링 작업.
  • > 에이전트가 하나의 코드베이스로 검색해야 하는 Scala와 Java 혼합 저장소.

에이전트 워크플로

  • > 서비스 메서드의 시그니처를 바꾸기 전에 모든 호출자를 찾습니다.
  • > 추상 멤버를 추가하기 전에 트레이트를 확장하는 클래스와 객체를 나열합니다.
  • > 요청이 HTTP 라우트에서 서비스를 거쳐 데이터 계층까지 이동하는 과정을 추적합니다.

엔진 세부 정보

  • > Scala 지원은 `.scala`와 `.sc`를 다룹니다. 클래스, 객체, 트레이트는 타입이며, 클래스 안에서 리시버 없이 호출하면 그 클래스 자신의 메서드로 해석됩니다.
  • > 리시버 타입 추론은 매개변수, 클래스 매개변수, `val`과 `var` 정의, `case` 패턴, 메서드 반환 타입, `extends` 절을 따라갑니다.
  • > 호출은 클래스로 한정된 이름을 유지하고, `new`는 인스턴스화로 계산되며, 약 320개의 표준 라이브러리 이름은 관계에서 걸러집니다.

유용한 MCP 진입점

  • find_symbol

    트레이트, 객체, 서비스 메서드의 정의와 참조가 필요할 때 사용하세요.

  • dependency_search

    시그니처를 바꾸기 전에 트레이트나 메서드에 incoming 탐색을 사용해 구현체와 호출자를 확인하세요.

  • get_task_context

    "주문 이벤트가 원장 기록기까지 어떻게 이어지는지 추적해 줘" 같은 프롬프트에 사용하세요.