/* 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 } }