2014-08-28 30 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 
    }  

Il risultato è: Scala parser tagli ultima staffa

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

mi aspettavo:

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

Gli ultimi parentesi } (e alla fine della riga) manca se uso posizione da oggetto Tree: text.substring(t.pos.start, t.pos.end)

Qualsiasi professionista posale come estrarre tutto il testo da scala.reflect.api.Trees # Oggetto albero?

Aggiornamento

versioni Scala interessati:

  • 2.10.6 - necessari per SBT 0.13.x
  • 2.11.8
  • 2.12.1

Per il risultato scala 2.10.6/2.12.1 è lo stesso come nell'output precedente.

Aggiungi progetto per GitHub

Example project for searching the solution

+0

ho trovato http : //grokbase.com/t/gg/scala-internals/129smefjxe/reflection-universe-and-range-positions. L'opzione '-Yrangepos' ne è responsabile. Come cambiare/impostare altra opzione? –

+0

2.11.6 ancora interessato –

risposta