2012-09-14 16 views
7

Compiler Codebase ist ziemlich groß, und ich kann nicht meinen Kopf um alles auf einmal wickeln :)Wo speichert Scala Compiler ASTs?

Derzeit möchte ich nur ASTs nach "Typer" -Phase von ihm bekommen. Gibt es einen Weg, es zu tun?

Ich betreibe den Compiler die folgende Art und Weise:

val settings = new Settings 
settings.classpath.value = ... 
val compiler = new Global(settings, new ConsoleReporter(settings)) 
new compiler.Run() { 
    override def stopPhase(name: String) = name == "superaccessors" 
} compileSources files 

Antwort

6

Verwendung -Xprint:typer (Bäume nach typer dump) zusammen mit -Yshow-trees-compact (die Bäume in rohen AST-Format dump). Wenn Sie auch -Yshow-trees-stringified verwenden, werden ASTs zusätzlich als Pseudo-Scala-Code ausgegeben (Hinweis: die letzten beiden Optionen erfordern 2.10.0).

C:\Projects\Kepler\sandbox @ ticket/6356>cat Test.scala 
class C { 
    def x = 2 
} 

C:\Projects\Kepler\sandbox @ ticket/6356>scalac -Xprint:typer -Yshow-trees-compact -Yshow-trees-stringified Test.scala 
[[syntax trees at end of typer]]// Scala source: Test.scala 
package <empty> { 
    class C extends scala.AnyRef { 
    def <init>(): C = { 
     C.super.<init>(); 
    () 
    }; 
    def x: Int = 2 
    } 
} 
PackageDef(
    Ident(<empty>), 
    List(
    ClassDef(Modifiers(), newTypeName("C"), List(), 
     Template(List(Select(Ident(scala), newTypeName("AnyRef"))), emptyValDef, 
     List(
     DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(Apply(Select(Super(This(newTypeName("C")), tpnme.EMPTY), nme.CONSTRUCTOR), List())), Literal(Constant(())))), 
     DefDef(Modifiers(), newTermName("x"), List(), List(), TypeTree(), Literal(Constant(2)))))))) 
+0

Aber ich meine, wie kann ich AST in meinem laufenden Programm bekommen? Programmatisch? – Rogach

+0

Huh. Aha. Lass mich nachdenken. –

+4

Verwenden von 'Run.units map (_.body)' –

1

Compiler Code-Basis ist ziemlich groß, und ich kann meinen Kopf nicht umschlingen sie alle auf einmal :)

Mit Ausnahme der alle wichtigen typer, die meisten Phasen des Scala-Compiler sind bei im Detail beschrieben:

http://lampwww.epfl.ch/~magarcia/ScalaCompilerCornerReloaded/

+0

Nun, das Problem ist, dass ich nur an den ersten vier Phasen interessiert bin - vom Parser zum Typer, und diese werden dort überhaupt nicht beschrieben :( – Rogach