diff options
author | Felix Mulder <felix.mulder@gmail.com> | 2016-04-27 12:00:29 +0200 |
---|---|---|
committer | Felix Mulder <felix.mulder@gmail.com> | 2016-04-28 11:00:39 +0200 |
commit | d04984596c6abfa27b217b12a42caca26f0c269f (patch) | |
tree | 5657a2a1da905954fbab71f49a9cb477f7a690e7 /src/dotty/tools/dotc/repl/AmmoniteReader.scala | |
parent | 96cedcdcd82148f091989836eb4959b2c3ec3382 (diff) | |
download | dotty-d04984596c6abfa27b217b12a42caca26f0c269f.tar.gz dotty-d04984596c6abfa27b217b12a42caca26f0c269f.tar.bz2 dotty-d04984596c6abfa27b217b12a42caca26f0c269f.zip |
Add multiline support using ammonite multilineFilter
Diffstat (limited to 'src/dotty/tools/dotc/repl/AmmoniteReader.scala')
-rw-r--r-- | src/dotty/tools/dotc/repl/AmmoniteReader.scala | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/dotty/tools/dotc/repl/AmmoniteReader.scala b/src/dotty/tools/dotc/repl/AmmoniteReader.scala index 0c4dd80ee..a3b2a1c56 100644 --- a/src/dotty/tools/dotc/repl/AmmoniteReader.scala +++ b/src/dotty/tools/dotc/repl/AmmoniteReader.scala @@ -11,9 +11,15 @@ import BasicFilters._ import GUILikeFilters._ import util.SourceFile -class AmmoniteReader extends InteractiveReader { +class AmmoniteReader(val interpreter: Interpreter)(implicit ctx: Context) extends InteractiveReader { val interactive = true + def incompleteInput(str: String): Boolean = + interpreter.beQuietDuring(interpreter.interpret(str)) match { + case Interpreter.Incomplete => true + case _ => false // TODO: should perhaps save output here? + } + val reader = new java.io.InputStreamReader(System.in) val writer = new java.io.OutputStreamWriter(System.out) val cutPasteFilter = ReadlineFilters.CutPasteFilter() @@ -21,11 +27,11 @@ class AmmoniteReader extends InteractiveReader { val selectionFilter = GUILikeFilters.SelectionFilter(indent = 2) val multilineFilter: Filter = Filter("multilineFilter") { case TermState(lb ~: rest, b, c, _) - if (lb == 10 || lb == 13) => // Enter - + if (lb == 10 || lb == 13) && incompleteInput(b.mkString) => BasicFilters.injectNewLine(b, c, rest) } - def readLine(prompt: String)(implicit ctx: Context): String = { + + def readLine(prompt: String): String = { val historyFilter = new HistoryFilter( () => history.toVector, Console.BLUE, @@ -39,9 +45,8 @@ class AmmoniteReader extends InteractiveReader { GUILikeFilters.altFilter, GUILikeFilters.fnFilter, ReadlineFilters.navFilter, - //autocompleteFilter, cutPasteFilter, - //multilineFilter, + multilineFilter, BasicFilters.all ) @@ -52,7 +57,6 @@ class AmmoniteReader extends InteractiveReader { allFilters, displayTransform = (buffer, cursor) => { val ansiBuffer = Ansi.Str.parse(SyntaxHighlighting(buffer)) - //val ansiBuffer = Ansi.Str.parse(SyntaxHighlighting(new SourceFile("<console>", buffer))) val (newBuffer, cursorOffset) = SelectionFilter.mangleBuffer( selectionFilter, ansiBuffer, cursor, Ansi.Reversed.On ) @@ -64,7 +68,9 @@ class AmmoniteReader extends InteractiveReader { (newNewBuffer, cursorOffset) } ) match { - case Some(s) => history = s :: history; s + case Some(res) => + history = res :: history; + res case None => ":q" } } |