summaryrefslogtreecommitdiff
path: root/src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala')
-rw-r--r--src/repl/scala/tools/nsc/interpreter/InteractiveReader.scala49
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
+}
+