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 }
Result:
scala> statements.head res1: String = libraryDependencies ++= Seq("org.scala-lang" % "scala-compiler" % "2.10.4") map { (dependency) =>{ dependency }
I expected:
libraryDependencies ++= Seq("org.scala-lang" % "scala-compiler" % "2.10.4") map { (dependency) =>{ dependency } }
The last brackets } (and the end of the line) are missing if I use the position from the Tree object: text.substring(t.pos.start, t.pos.end)
Any suggestion on how to extract all text from scala.reflect.api.Trees # Tree object?
Update
Affected scala versions:
- 2.10.6 - required for sbt 0.13.x
- 2.11.8
- 2.12.1
In the case of scala 2.10.6 / 2.12.1, the result is the same as in the output above.
Add project to github
Sample project for finding a solution
source share