diff options
Diffstat (limited to 'src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala')
-rw-r--r-- | src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala b/src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala new file mode 100644 index 0000000000..28ddf2939c --- /dev/null +++ b/src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala @@ -0,0 +1,49 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2013 LAMP/EPFL + * @author Stepan Koltsov + */ + +package scala.tools.nsc +package interpreter + +import java.io.IOException +import session.History +import InteractiveReader._ +import Properties.isMac + +/** Reads lines from an input stream */ +trait InteractiveReader { + val interactive: Boolean + + def reset(): Unit + def history: History + def completion: Completion + def redrawLine(): Unit + + def readYesOrNo(prompt: String, alt: => Boolean): Boolean = readOneKey(prompt) match { + case 'y' => true + case 'n' => false + case _ => alt + } + + protected def readOneLine(prompt: String): String + protected def readOneKey(prompt: String): Int + + 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.", "2.9.0") + def createDefault(): InteractiveReader = apply() // used by sbt +} + |