scala.tools.nsc.interpreter.ReplConfig.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.nsc
package interpreter
import scala.util.control.ControlThrowable
import util.Exceptional.unwrap
import util.stackTraceString
trait ReplConfig {
lazy val replProps = new ReplProps
class TapMaker[T](x: T) {
def tapInfo(msg: => String): T = tap(x => replinfo(parens(x)))
def tapDebug(msg: => String): T = tap(x => repldbg(parens(x)))
def tapTrace(msg: => String): T = tap(x => repltrace(parens(x)))
def tap[U](f: T => U): T = {
f(x)
x
}
}
private def parens(x: Any) = "(" + x + ")"
private def echo(msg: => String) =
try Console println msg
catch { case x: AssertionError => Console.println("Assertion error printing debugging output: " + x) }
private[nsc] def repldbgex(ex: Throwable): Unit = {
if (isReplDebug) {
echo("Caught/suppressing: " + ex)
ex.printStackTrace
}
}
private[nsc] def repldbg(msg: => String) = if (isReplDebug) echo(msg)
private[nsc] def repltrace(msg: => String) = if (isReplTrace) echo(msg)
private[nsc] def replinfo(msg: => String) = if (isReplInfo) echo(msg)
private[nsc] def logAndDiscard[T](label: String, alt: => T): PartialFunction[Throwable, T] = {
case t: ControlThrowable => throw t
case t: Throwable =>
repldbg(label + ": " + unwrap(t))
repltrace(stackTraceString(unwrap(t)))
alt
}
private[nsc] def substituteAndLog[T](alt: => T)(body: => T): T =
substituteAndLog("" + alt, alt)(body)
private[nsc] def substituteAndLog[T](label: String, alt: => T)(body: => T): T = {
try body
catch logAndDiscard(label, alt)
}
private[nsc] def squashAndLog(label: String)(body: => Unit): Unit =
substituteAndLog(label, ())(body)
def isReplTrace: Boolean = replProps.trace
def isReplDebug: Boolean = replProps.debug || isReplTrace
def isReplInfo: Boolean = replProps.info || isReplDebug
def isReplPower: Boolean = replProps.power
}