본문으로 건너뛰기
cd /languages
  • 모던 JVM
  • 프로그래밍
  • AST 및 심볼 지원

Maguyva의 Kotlin 지원: Android와 JVM을 위한 코드 그래프

Maguyva는 AST, 심볼, 그래프로 Kotlin을 지원하여, AI 에이전트가 Android와 JVM 코드 전반에서 클래스, 확장 함수, 코루틴을 따라갈 수 있게 합니다.

Kotlin이 얕은 AI 도구를 넘어뜨리는 지점

Kotlin이 간결한 이유는 연결을 숨기기 때문입니다. apply, let, also, run, with는 this와 it의 의미를 바꿉니다. 확장 함수는 다른 곳에서 정의된 타입에 동작을 붙입니다. 코루틴은 launch, async, withContext를 오가며 작업을 옮깁니다. 파일을 하나씩 읽는 에이전트는 호출은 보지만 그 뒤의 리시버는 보지 못합니다.

Maguyva는 인덱싱 시점에 그런 구조를 더 많이 해석하므로, 에이전트가 함수의 호출자를 물으면 진짜 답을 얻습니다.

Maguyva가 Kotlin에서 추출하는 것

Maguyva는 .kt와 .kts를 지원합니다. 함수, 클래스, 객체, 컴패니언 객체가 추출되고, 함수 시그니처에는 확장 리시버, 매개변수 이름, 기본값, vararg 매개변수가 기록됩니다.

호출 관계는 클래스 한정 이름을 유지하므로, OrderRepository.save는 다른 save와 구별됩니다. 리시버 타입 추론은 apply와 run 안의 this, let과 also 안의 it, 그리고 with의 인자를 따라가므로, 스코프 함수 안의 호출도 올바른 타입으로 해석됩니다. 코루틴 빌더와 Flow 연산자(launch, async, withContext, coroutineScope, supervisorScope, flow, emit, delay, Channel)는 의도적으로 그래프에 남겨 둡니다.

그래프에는 상속, 인터페이스 구현, 오버라이드, 인스턴스화, 어노테이션, 타입 참조, 읽기와 쓰기, 예외 throw와 catch 엣지도 기록됩니다.

에이전트 프롬프트 예시

  • “CheckoutUseCase.invoke를 누가 호출하고, 어떤 ViewModel에서 호출하나요?” (find_symbol, 그다음 dependency_search incoming)
  • “SyncWorker에서 네트워크 클라이언트까지 동기화 흐름을 추적해 줘.” (get_task_context)
  • “PaymentGateway를 구현하는 클래스는 무엇인가요?” (dependency_search)

알려진 한계

  • 약 250개의 Kotlin 표준 라이브러리 및 플랫폼 호출은 관계에서 걸러지므로, listOf, map, filter, println 같은 헬퍼는 그래프 엣지가 아닙니다. 이런 호출에는 text_pattern_search를 사용하세요.

다음 단계

빠른 시작으로 저장소를 연결한 다음, 호환성 페이지에서 지원 매트릭스를 확인하세요. 혼합 코드베이스라면 Java 가이드도 읽어 보세요.

가장 적합한 경우

  • > ViewModel, 리포지토리, 유스케이스가 모듈을 넘나들며 서로 호출하는 대규모 멀티 모듈 앱을 가진 Android 팀.
  • > Kotlin과 오래된 Java 코드가 섞여 있는 서버 사이드 Kotlin 및 Kotlin/JVM 서비스.
  • > 에이전트가 애플리케이션 코드와 함께 읽어야 하는, Kotlin 스크립트(`.kts`)로 작성된 Gradle 빌드.

에이전트 워크플로

  • > 리포지토리나 유스케이스 클래스의 API를 바꾸기 전에 모든 호출자를 찾습니다.
  • > ViewModel의 `launch`에서 `withContext`를 거쳐 데이터 계층까지 코루틴 흐름을 추적합니다.
  • > 리팩터링 전에 어떤 클래스가 인터페이스를 구현하거나 베이스 메서드를 오버라이드하는지 매핑합니다.

엔진 세부 정보

  • > Kotlin 지원은 `.kt`와 `.kts`를 포함합니다. 시그니처에는 확장 리시버, 매개변수 이름, 기본값, `vararg` 매개변수가 기록됩니다.
  • > 리시버 타입 추론은 `apply`와 `run` 안의 `this`, `let`과 `also` 안의 `it`, `with`의 인자를 따라가며, 호출은 클래스 한정 이름을 유지합니다.
  • > `launch`, `withContext`, `flow` 같은 코루틴 빌더와 Flow 연산자는 그래프에 남고, 약 250개의 표준 라이브러리 호출은 걸러집니다.

유용한 MCP 진입점

  • find_symbol

    정의와 참조가 필요할 때 클래스, 유스케이스, 확장 함수로 쓰세요.

  • dependency_search

    API를 바꾸기 전에 리포지토리나 인터페이스에 incoming 탐색을 써서 호출자와 구현 클래스를 확인하세요.

  • get_task_context

    “`SyncWorker`에서 네트워크 클라이언트까지 동기화 흐름을 추적해 줘” 같은 프롬프트에 쓰세요.