2014-08-28 26 views
5
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_121). 
Type in expressions for evaluation. Or try :help. 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.reflect.runtime._ 
import scala.reflect.runtime.universe._ 
import scala.tools.reflect.ToolBox 

val mirror = universe.runtimeMirror(universe.getClass.getClassLoader) 
val toolbox = mirror.mkToolBox(options = "-Yrangepos") 
val text = 
    """ 
    |libraryDependencies ++= Seq("org.scala-lang" % "scala-compiler" % "2.10.4") map { 
    | (dependency) =>{ 
    |  dependency 
    | } 
    |} 
    """.stripMargin 
val parsed = toolbox.parse(text) 

val parsedTrees = parsed match { 
    case Block(stmt, expr) => 
    stmt :+ expr 
    case t: Tree => 
    Seq(t) 
} 

val statements = parsedTrees.map { (t: Tree) => 
    text.substring(t.pos.start, t.pos.end) 
} 


// Exiting paste mode, now interpreting. 

import scala.reflect.runtime._ 
import scala.reflect.runtime.universe._ 
import scala.tools.reflect.ToolBox 
mirror: reflect.runtime.universe.Mirror = JavaMirror with primordial classloader with boot classpath... 
scala> statements.head 
res0: String = 
libraryDependencies ++= Seq("org.scala-lang" % "scala-compiler" % "2.10.4") map { 
    (dependency) =>{ 
     dependency 
    }  

Wynikiem jest: Scala parser cięć w ubiegłym wysięgniki

scala> statements.head 
res1: String = 
libraryDependencies ++= Seq("org.scala-lang" % "scala-compiler" % "2.10.4") map { 
    (dependency) =>{ 
     dependency 
    } 

Spodziewałem:

libraryDependencies ++= Seq("org.scala-lang" % "scala-compiler" % "2.10.4") map { 
    (dependency) =>{ 
     dependency 
    } 
} 

Ostatnie wsporniki } (i koniec linii) brakuje, jeśli mogę użyć pozycję z obiektu drzewa: text.substring(t.pos.start, t.pos.end)

Dowolny pro posal jak wyodrębnić cały tekst z scala.reflect.api.Trees # Obiekt Tree?

Aktualizacja

Zagrożone wersje Scala:

  • 2.10.6 - potrzebne do SBT 0.13.x
  • 2.11.8
  • 2.12.1

Dla Scala 2.10.6/2.12.1 Wynik jest taki sam jak w powyższym wyniku.

Dodaj projekt do GitHub

Example project for searching the solution

+0

znalazłem http : //grokbase.com/t/gg/scala-internals/129smefjxe/reflection-universe-and-range-positions. Opcja "-Yrangepos" jest za to odpowiedzialna. Jak zmienić/ustawić inną opcję? –

+0

nadal dotyczy 2.11.6 –

Odpowiedz