How to invoke the Scala compiler programmatically?

scala, scala-compiler

Solution

ToolBox

I think the proper way of invoking the Scala compiler is doing it via Reflection API documented in Overview. Specifically, Tree Creation via parse on ToolBoxes section in 'Symbols, Trees, and Types' talks about parsing `String` into `Tree` using `ToolBox`. You can then invoke `eval()` etc.

scala.tools.nsc.Global

But as Shyamendra Solanki wrote, in reality you can drive scalac's `Global` to get more done. I've written CompilerMatcher so I can compile generated code with sample code to do integration tests for example.

scala.tools.ncs.IMain

You can invoke the REPL `IMain` to evaluate the code (this is also available in the above `CompilerMatcher` if you want something that works with Scala 2.10):

  val main = new IMain(s) {
    def lastReq = prevRequestList.last
  }
  main.compileSources(files.map(toSourceFile(_)): _*)
  code map { c => main.interpret(c) match {
    case IR.Error => sys.error("Error interpreting %s" format (c))
    case _ => 
  }}
  val holder = allCatch opt {
    main.lastReq.lineRep.call("$result")
  }

This was demonstrated in Embedding the Scala Interpreter post by Josh Suereth back in 2009.

Problem

I want my Scala code to take a Scala class as input, compile and execute that class. How can I programmatically invoke a Scala compiler? I will be using the latest Scala version, i.e. 2.10.

Original source

Related problems