scala.tools.nsc.interpreter.ReplGlobal.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 SubScript extension of the Scala Programming Language
The newest version!
/* NSC -- new Scala compiler
* Copyright 2005-2013 LAMP/EPFL
* @author Paul Phillips
*/
package scala.tools.nsc
package interpreter
import typechecker.Analyzer
/** A layer on top of Global so I can guarantee some extra
* functionality for the repl. It doesn't do much yet.
*/
trait ReplGlobal extends Global {
// This exists mostly because using the reporter too early leads to deadlock.
private def echo(msg: String) { Console println msg }
override def abort(msg: String): Nothing = {
echo("ReplGlobal.abort: " + msg)
super.abort(msg)
}
override lazy val analyzer = new {
val global: ReplGlobal.this.type = ReplGlobal.this
} with Analyzer {
override protected def findMacroClassLoader(): ClassLoader = {
val loader = super.findMacroClassLoader
macroLogVerbose("macro classloader: initializing from a REPL classloader: %s".format(global.classPath.asURLs))
val virtualDirectory = globalSettings.outputDirs.getSingleOutput.get
new util.AbstractFileClassLoader(virtualDirectory, loader) {}
}
override def newTyper(context: Context): Typer = new Typer(context) {
override def typed(tree: Tree, mode: Mode, pt: Type): Tree = {
val res = super.typed(tree, mode, pt)
tree match {
case Ident(name) if !tree.symbol.hasPackageFlag && !name.toString.startsWith("$") =>
repldbg("typed %s: %s".format(name, res.tpe))
case _ =>
}
res
}
}
}
object replPhase extends SubComponent {
val global: ReplGlobal.this.type = ReplGlobal.this
val phaseName = "repl"
val runsAfter = List[String]("typer")
val runsRightAfter = None
def newPhase(_prev: Phase): StdPhase = new StdPhase(_prev) {
def apply(unit: CompilationUnit) {
repldbg("Running replPhase on " + unit.body)
// newNamer(rootContext(unit)).enterSym(unit.body)
}
}
// add to initial or terminal phase to sanity check Run at construction
override val requires = List("typer") // ensure they didn't -Ystop-after:parser
}
override protected def computePhaseDescriptors: List[SubComponent] = {
addToPhasesSet(replPhase, "repl")
super.computePhaseDescriptors
}
}