scala.tools.reflect.package.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scala-compiler Show documentation
Show all versions of scala-compiler Show documentation
Compiler for the Scala Programming Language
/* NSC -- new Scala compiler
* Copyright 2005-2013 LAMP/EPFL
* @author Paul Phillips
*/
package scala.tools
import scala.reflect.api.JavaUniverse
import scala.reflect.internal.util.Position
import scala.language.implicitConversions
import scala.tools.nsc.reporters._
import scala.tools.nsc.Settings
package object reflect {
// [todo: can we generalize this?
import scala.reflect.runtime.{universe => ru}
implicit def ToolBox(mirror0: ru.Mirror): ToolBoxFactory[ru.type] =
new ToolBoxFactory[ru.type](mirror0.universe) {
lazy val mirror = mirror0
}
// todo. replace this with an implicit class, once the pesky warning is gone
// we don't provide `Eval` for trees, because it's unclear where to get an evaluation mirror from
implicit def Eval[T](expr: JavaUniverse # Expr[T]): Eval[T] = new Eval[T](expr)
/** Creates a UI-less reporter that simply accumulates all the messages
*/
def mkSilentFrontEnd(): FrontEnd = new FrontEnd {
def display(info: Info) {}
def interactive() {}
}
/** Creates a reporter that prints messages to the console according to the settings.
*
* ``minSeverity'' determines minimum severity of the messages to be printed.
* 0 stands for INFO, 1 stands for WARNING and 2 stands for ERROR.
*/
// todo. untangle warningsAsErrors from Reporters. I don't feel like moving this flag here!
def mkConsoleFrontEnd(minSeverity: Int = 1): FrontEnd = {
val settings = new Settings()
if (minSeverity <= 0) settings.verbose.value = true
if (minSeverity > 1) settings.nowarn.value = true
reporterToFrontEnd(new ConsoleReporter(settings))
}
private[reflect] def reporterToFrontEnd(reporter: Reporter): FrontEnd = new FrontEnd {
val API_INFO = INFO
val API_WARNING = WARNING
val API_ERROR = ERROR
override def hasErrors = reporter.hasErrors
override def hasWarnings = reporter.hasWarnings
def display(info: Info): Unit = info.severity match {
case API_INFO => reporter.info(info.pos, info.msg, false)
case API_WARNING => reporter.warning(info.pos, info.msg)
case API_ERROR => reporter.error(info.pos, info.msg)
}
def interactive(): Unit = reporter match {
case reporter: AbstractReporter => reporter.displayPrompt()
case _ => // do nothing
}
override def flush(): Unit = {
super.flush()
reporter.flush()
}
override def reset(): Unit = {
super.reset()
reporter.reset()
}
}
private[reflect] def frontEndToReporter(frontEnd: FrontEnd, settings0: Settings): Reporter = new AbstractReporter {
val settings = settings0
import frontEnd.{Severity => ApiSeverity}
val API_INFO = frontEnd.INFO
val API_WARNING = frontEnd.WARNING
val API_ERROR = frontEnd.ERROR
type NscSeverity = Severity
val NSC_INFO = INFO
val NSC_WARNING = WARNING
val NSC_ERROR = ERROR
def display(pos: Position, msg: String, nscSeverity: NscSeverity): Unit =
frontEnd.log(pos, msg, nscSeverity match {
case NSC_INFO => API_INFO
case NSC_WARNING => API_WARNING
case NSC_ERROR => API_ERROR
})
def displayPrompt(): Unit =
frontEnd.interactive()
override def flush(): Unit = {
super.flush()
frontEnd.flush()
}
override def reset(): Unit = {
super.reset()
frontEnd.reset()
}
}
}
package reflect {
class Eval[T](expr: JavaUniverse # Expr[T]) {
def eval: T = {
val factory = new ToolBoxFactory[JavaUniverse](expr.mirror.universe) { val mirror = expr.mirror.asInstanceOf[this.u.Mirror] }
val toolBox = factory.mkToolBox()
toolBox.eval(expr.tree.asInstanceOf[toolBox.u.Tree]).asInstanceOf[T]
}
}
}