blob: 782fd52ab29b357f8d683f403600c66d781bc969 (
plain) (
tree)
|
|
/* NSC -- new Scala compiler
* Copyright 2005-2011 LAMP/EPFL
* @author Stepan Koltsov
*/
package scala.tools.nsc
package interpreter
import java.io.IOException
import java.nio.channels.ClosedByInterruptException
import scala.util.control.Exception._
import session.History
import InteractiveReader._
import Properties.isMac
/** Reads lines from an input stream */
trait InteractiveReader {
val interactive: Boolean
def history: History
def completion: Completion
def keyBindings: List[KeyBinding]
def init(): Unit
def reset(): Unit
protected def readOneLine(prompt: String): String
def redrawLine(): Unit
def currentLine: String
def readLine(prompt: String): String =
// hack necessary for OSX jvm suspension because read calls are not restarted after SIGTSTP
if (isMac) restartSysCalls(readOneLine(prompt), reset())
else readOneLine(prompt)
}
object InteractiveReader {
val msgEINTR = "Interrupted system call"
def restartSysCalls[R](body: => R, reset: => Unit): R =
try body catch {
case e: IOException if e.getMessage == msgEINTR => reset ; body
}
def apply(): InteractiveReader = SimpleReader()
@deprecated("Use `apply` instead.")
def createDefault(): InteractiveReader = apply()
}
|