Vous pourriez jeter un coup d'œil à la scaladoc ( http://docs.scala-lang.org/overviews/reflection/symbols-trees-types.html#trees ) ou aux diapositives ( http://scalamacros.org/talks/2012-04-28-MetaprogrammingInScala210.pdf (la partie "Apprendre à apprendre").
Voici ce que je fais habituellement. J'ai écrit un simple script appelé parse
qui prend le code Scala comme argument et le compile ensuite avec -Xprint:parser -Ystop-after:parser -Yshow-trees-stringified -Yshow-trees-compact
( parse
utilise une autre aide script : adhoc-scalac
. cliquez ici pour voir ses sources également).
L'avantage de cette approche par rapport à showRaw
c'est qu'il n'exige pas que le code vérifie le type. Vous pouvez écrire un petit bout de code, qui fait référence à des variables ou des classes inexistantes, et il s'exécutera quand même avec succès et vous montrera l'AST. Voici un exemple de sortie :
09:26 ~$ parse 'class C { def x = 2 }'
[[syntax trees at end of parser]]// Scala source: tmp36sVGp
package <empty> {
class C extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
def x = 2
}
}
PackageDef(Ident(TermName("<empty>")), List(ClassDef(Modifiers(), TypeName("C"), List(), Template(List(Select(Ident(scala), TypeName("AnyRef"))), emptyValDef, List(DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(pendingSuperCall), Literal(Constant(())))), DefDef(Modifiers(), TermName("x"), List(), List(), TypeTree(), Literal(Constant(2))))))))
Il y a aussi un script appelé typecheck
qui fait la même chose, mais s'arrête après typer
. C'est parfois utile pour comprendre comment le vérificateur de type transforme exactement les arbres de l'analyseur. Cependant, les boîtes à outils et les macros fonctionnent toutes deux avec des arbres d'analyseurs, c'est pourquoi je me sers de typecheck
à des fins de construction d'arbres très rarement.