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

sonucudur: Scala ayrıştırıcı keser geçen braket

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

beklediğim:

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

Ben pozisyonunu kullanırsanız son parantez } (ve satır sonu) eksik Tree nesnesinden: text.substring(t.pos.start, t.pos.end)

Herhangi bir pro posal scala.reflect.api.Trees # Tree nesnesinden tüm metni nasıl ayıklanır?

Güncelleme

Etkilenen skala sürümleri:

  • 2.10.6 - sbt için gerekli 0.13.x
  • 2.11.8
  • 2.12.1

için scala 2.10.6/2.12.1 sonuç, yukarıdaki çıktıda olduğu gibi aynıdır.

Ekleme projesi

Example project for searching the solution

+0

buldum http : //grokbase.com/t/gg/scala-internals/129smefjxe/reflection-universe-and-range-positions. Seçenek '-Yrangepos' bunun sorumluluğundadır. Başka bir seçenek nasıl değiştirilir/ayarlanır? –

+0

2.11.6 hala etkileniyor –

cevap