Eu preciso converter um Expr
para Tree
fazer o desenvolvimento macro do Scala 3 e ainda não encontrei um mecanismo de conversão apropriado para isso.
No Scala 2 existia um tree
método Expr
que facilitava essa tarefa a meu ver, assim:
def expr_impl(c: blackbox.Context)(expr: c.Expr[AnyRef]): c.Expr[Expression] = {
import c.universe._
expr.tree match {
//...
}
}
Mas esse método parece ter sido removido no Scala 3.
Eu preciso disso para examinar os resultados do uso de uma expressão de aspas. Se eu usar showRaw
, a saída não é detalhada, o que é um problema no meu caso:
import scala.quoted.*
import scala.reflect.runtime.universe.showRaw
import quotes.reflect.*
//...
val obj: Expr[_] = '{object AnObject}
report.error(s"from macro annotation1 ${showRaw(obj)}")
Isso resulta em uma saída não detalhada como esta:from macro annotation1 '{ ... }
Também tentei Printer.TreeStructure.show
, que espera um Tree
em vez de Expr
, e é por isso que preciso da conversão mencionada, pois Printer.TreeStructure.show
resultaria em uma saída detalhada.
Se houver algum método que seja detalhado e semelhante Printer.TreeStructure.show
e espere um Expr
como argumento, isso também resolveria meu problema.
Eu não diria
.tree
que foi removido - as citações do Scala 3 devem ser consideradas uma implementação completamente nova, que pode ter algumas contrapartes do conteúdo de contextos do Scala 2, mas nem sempre e mesmo quando tem, pode ter um nome diferente.Para se transformar
Expr[A]
emquotes.reflect.Tree
você deve chamá.asTerm
-lo -Term
é um subtipo deTree
.E para imprimir AST em formato bruto em vez de uma impressão bonita, pode-se fornecer
(using Printer.TreeStructure)
aoshow
método de extensão (disponível quando você converteExpr
eTerm
importa coisas deQuotes
):