Я использую набор инструментов из API компилятора Scala, чтобы скомпилировать код в AST, а затем разбить / объединить их и объединить в одно дерево.В целях отладки я пытаюсь отследить, какие узлы пришли из какого исходного кода.
Пример:
import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox
// obtain toolbox
val tb = runtimeMirror(this.getClass.getClassLoader).mkToolBox()
// get and parse source code from file
val myCode = scala.io.Source.fromFile("MyCode.scala").mkString
val myTree = tb.parse(myCode)
// get and parse dynamically-generated source code
val genCode = com.example.CodeGenerator.gimmeCode
val genTree = tb.parse(genCode)
// get and parse source code from a string literal
val literalCode = """println("to life, the universe, and everything")"""
val literalTree = tb.parse(literalCode)
// an over-simplified combination of the trees
val frankensteinsTree = q"$myTree;$genTree;$literalTree"
// walk the tree an print the source of each element
val traverser = new Traverser() {
override def traverse(tree: Tree): Unit = {
println("This node originated from " + tree.pos.source)
super.traverse(tree)
}
}
// the root element prints "This node originated from <no source file>"
// the rest print "This node originated from <toolbox>"
traverser.traverse(frankensteinsTree)
В приведенном выше примере все, кроме корневого узла, показывают, что источником является <toolbox>
.(Корневой узел говорит <no source file>
.) Прежде чем разбирать и объединять их, есть ли способ указать tree.pos.source, чтобы вместо этого идентифицировать фактическое происхождение каждого узла?