package dotty.tools package dotc package repl import core.Contexts._ import ammonite.terminal._ import LazyList._ import Ansi.Color import filters._ import BasicFilters._ import GUILikeFilters._ import util.SourceFile import printing.SyntaxHighlighting class AmmoniteReader(val interpreter: Interpreter)(implicit ctx: Context) extends InteractiveReader { val interactive = true def incompleteInput(str: String): Boolean = interpreter.delayOutputDuring(interpreter.interpret(str)) match { case Interpreter.Incomplete => true case _ => false } val reader = new java.io.InputStreamReader(System.in) val writer = new java.io.OutputStreamWriter(System.out) val cutPasteFilter = ReadlineFilters.CutPasteFilter() var history = List.empty[String] val selectionFilter = GUILikeFilters.SelectionFilter(indent = 2) val multilineFilter: Filter = Filter("multilineFilter") { case TermState(lb ~: rest, b, c, _) if (lb == 10 || lb == 13) && incompleteInput(b.mkString) => BasicFilters.injectNewLine(b, c, rest, indent = 2) } def readLine(prompt: String): String = { val historyFilter = new HistoryFilter( () => history.toVector, Console.BLUE, AnsiNav.resetForegroundColor ) val allFilters = Filter.merge( UndoFilter(), historyFilter, selectionFilter, GUILikeFilters.altFilter, GUILikeFilters.fnFilter, ReadlineFilters.navFilter, cutPasteFilter, multilineFilter, BasicFilters.all ) Terminal.readLine( Console.BLUE + prompt + Console.RESET, reader, writer, allFilters, displayTransform = (buffer, cursor) => { val coloredBuffer = if (ctx.useColors) SyntaxHighlighting(buffer) else buffer val ansiBuffer = Ansi.Str.parse(coloredBuffer.toVector) val (newBuffer, cursorOffset) = SelectionFilter.mangleBuffer( selectionFilter, ansiBuffer, cursor, Ansi.Reversed.On ) val newNewBuffer = HistoryFilter.mangleBuffer( historyFilter, newBuffer, cursor, Ansi.Color.Green ) (newNewBuffer, cursorOffset) } ) match { case Some(res) => history = res :: history; res case None => ":q" } } }