Vai al contenuto
cd /languages
  • JVM tipizzata
  • Programmazione
  • Supporto AST e simboli

Scala in Maguyva: grafi del codice per servizi JVM e Spark

Maguyva supporta Scala con AST, simboli e grafo, così gli agenti IA seguono trait, object, case class e chiamate tipizzate nel codice JVM e Spark.

Dove Scala fa inciampare gli strumenti di IA superficiali

In Scala un nome porta con sé molto. Un trait, il suo companion object e una case class possono condividere un concetto. Il pattern matching lega nuovi nomi dentro le clausole case, e un metodo chiamato senza receiver dentro una classe è una chiamata su this. Un agente che legge un file alla volta vede i nomi, ma non ciò a cui si risolvono.

Maguyva ne risolve una parte maggiore in fase di indicizzazione, così un agente può chiedere chi chiama un metodo e ottenere una risposta su cui agire.

Cosa estrae Maguyva in Scala

Maguyva copre i file .scala e .sc. Classi, object e trait vengono estratti come tipi, e il preset functions di structural_search copre dichiarazioni e definizioni def, oltre alle lambda. Le firme registrano i parametri ripetuti (*), e gli import perdono il prefisso _root_.

Le relazioni di chiamata mantengono i nomi qualificati dalla classe, e una chiamata senza receiver dentro una classe si risolve sul metodo di quella classe. La tipizzazione dei receiver segue parametri, parametri di classe, definizioni val e var, pattern tipizzati e di case class nelle clausole case, i tipi di ritorno dei metodi di classi, object e trait, gli alias di tipo e le clausole extends. new su un tipo con iniziale maiuscola conta come istanziazione.

Per Scala nessun tipo di relazione è marcato come non applicabile, quindi il grafo registra anche ereditarietà, override, riferimenti di tipo, letture e scritture, flusso di controllo e archi di eccezione.

Esempi di prompt per agenti

  • “Chi chiama PaymentService.capture, e da quali route?” (find_symbol, poi dependency_search incoming)
  • “Quali classi e object estendono EventHandler?” (dependency_search)
  • “Traccia come un evento d’ordine raggiunge lo scrittore del libro mastro.” (get_task_context)

Limiti noti

  • Circa 320 nomi della libreria standard vengono filtrati dalle relazioni: operazioni sulle collezioni come map, flatMap e foldLeft, più helper di Option, Either, Try, Future e Predef. Una chiamata su this, o su un valore il cui tipo si risolve in una delle tue classi, viene mantenuta anche se il nome è in quell’elenco. Usa text_pattern_search se un chiamante sembra ancora mancare.
  • I parametri di tipo brevi come A, F e CC, e i tipi radice come Any, Unit e Nothing, vengono filtrati dai riferimenti di tipo.

Prossimi passi

Collega un repository con la guida rapida, poi consulta la matrice di supporto nella pagina di compatibilità. Per basi di codice JVM miste, leggi anche la guida a Java e la guida a Kotlin.

Il più adatto per

  • > Servizi JVM scritti in Scala, in cui trait, companion object e case class distribuiscono un concetto su molti file.
  • > Job Spark e di data engineering che gli agenti devono leggere insieme alle librerie condivise che chiamano.
  • > Repository misti Scala e Java che gli agenti devono esplorare come un'unica base di codice.

Workflow degli agenti

  • > Trovare tutti i chiamanti di un metodo di servizio prima di cambiarne la firma.
  • > Elencare quali classi e object estendono un trait prima di aggiungere un membro astratto.
  • > Tracciare come una richiesta passa da una route HTTP ai servizi fino al livello dati.

Dettagli del motore

  • > Il supporto a Scala copre `.scala` e `.sc`. Classi, object e trait sono tipi, e le chiamate senza receiver dentro una classe si risolvono sui suoi metodi.
  • > La tipizzazione dei receiver segue parametri, parametri di classe, definizioni `val` e `var`, pattern `case`, tipi di ritorno dei metodi e clausole `extends`.
  • > Le chiamate mantengono i nomi qualificati dalla classe, `new` conta come istanziazione e circa 320 nomi della libreria standard vengono filtrati dalle relazioni.

Punti di ingresso MCP utili

  • find_symbol

    Usalo per un trait, un object o un metodo di servizio quando ti servono definizione e riferimenti.

  • dependency_search

    Usa l'attraversamento incoming su un trait o un metodo per vedere implementazioni e chiamanti prima di cambiare una firma.

  • get_task_context

    Usalo per prompt come "traccia come un evento d'ordine raggiunge lo scrittore del libro mastro".