scala.runtime.WorksheetSupport.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scala-library Show documentation
Show all versions of scala-library Show documentation
Standard library for the Scala Programming Language
package scala.runtime
import java.io.{OutputStream, PrintStream}
import scala.runtime.ScalaRunTime.stringOf
/** A utility object that's needed by the code that executes a worksheet.
*/
@deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0")
object WorksheetSupport {
/** The offset in the source which should be printed */
private var currentOffset = 0
/** A stream that flushes in regular intervals so that output can be captured
* in real time. The flush interval is determined by the field "flushInterval".
* By default it is 30ms.
*/
private class FlushedOutputStream(out: OutputStream) extends OutputStream {
protected def flushInterval = 30000000L // interval between flushes, by default 30ms
protected def width = 80 // output width, by default 80 characters
protected def tabInc = 8 // tab increment, by default 8 characters
private var lastFlush: Long = 0L
private var col = -1
override def write(b: Array[Byte], off: Int, len: Int) = {
for (idx <- off until (off + len min b.length)) writeOne(b(idx))
flush()
}
override def write(c: Int) {
writeOne(c)
flush()
}
override def flush() {
val current = System.nanoTime
if (current - lastFlush >= flushInterval) {
out.flush()
lastFlush = current
}
}
def writeOne(c: Int) {
if (col < 0) {
col = 0
write((currentOffset+" ").getBytes)
}
out.write(c)
col =
if (c == '\n') -1
else if (c == '\t') (col / tabInc) * tabInc + tabInc
else col + 1
if (col >= width) writeOne('\n')
}
def ensureNewLine() = if (col > 0) writeOne('\n')
}
private val flushedOut = new FlushedOutputStream(System.out)
private val printOut = new PrintStream(flushedOut)
private def redirected(op: => Unit) = {
val oldSysOut = System.out
val oldSysErr = System.err
val oldConsOut = Console.out
val oldConsErr = Console.err
System.setOut(printOut)
System.setErr(printOut)
Console.setOut(printOut)
Console.setErr(printOut)
try op
finally {
printOut.close()
System.setOut(oldSysOut)
System.setErr(oldSysErr)
Console.setOut(oldConsOut)
Console.setErr(oldConsErr)
}
}
def $execute(op: => Unit) = redirected {
try op
catch {
case ex: StopException => ;
case ex: Throwable => ex.printStackTrace()
}
}
def $skip(n: Int) = {
flushedOut.ensureNewLine()
currentOffset += n
}
def $stop() = throw new StopException
def $show(x: Any): String = stringOf(x)
}
class StopException extends Exception