@@ -79,7 +79,7 @@ private[codegen] object Repl {
7979 override def execute (): String = {
8080 val abiDef =
8181 if (selector == ctorSelector) throw new InvalidCommandException (" ctor have outputs" )
82- else defs.filter(_ .isFunction).find(_.name.get == selector).get
82+ else defs.filter(d => d .isFunction || d.isConstant ).find(_.name.get == selector).get
8383 if (abiDef.outputs.get.exists(_.isTupleTpe)) throw new InvalidCommandException (" tuple type unsupported now" )
8484 val types = abiDef.outputs.get.map(_.tpe.toString)
8585 def helper [T ]: Option [T ] = None
@@ -165,35 +165,59 @@ private[codegen] object Repl {
165165
166166 def execute (raw : String ): Unit = {
167167 try {
168+ history = history :+ raw
168169 parseCmd(raw) match {
169170 case cmd : Load => ctx = cmd.execute()
170171 case cmd : EncodeArg => println(cmd.copy(defs = ctx).execute())
171172 case cmd : DecodeRet => println(cmd.copy(defs = ctx).execute())
172173 case cmd : Command => cmd.execute()
173174 }
174- history = history :+ raw
175175 } catch {
176176 case NonFatal (exp) => println(exp)
177177 case e : Throwable => throw e
178178 }
179179 }
180180
181181 // TODO: remove unnecessary filters
182+ val historyFilter = new HistoryFilter (() => history.toVector, fansi.Attrs .Empty )
183+ val selection = GUILikeFilters .SelectionFilter (indent = 4 )
182184 val filters = Filter .merge(
183185 UndoFilter (),
184186 ReadlineFilters .CutPasteFilter (),
185- new HistoryFilter (() => history.toVector, fansi. Attrs . Empty ) ,
186- GUILikeFilters . SelectionFilter (indent = 4 ) ,
187+ historyFilter ,
188+ selection ,
187189 BasicFilters .tabFilter(4 ),
188190 GUILikeFilters .altFilter,
189191 GUILikeFilters .fnFilter,
190192 ReadlineFilters .navFilter,
191193 BasicFilters .all)
192194 val reader = new InputStreamReader (System .in)
193195 val writer = new OutputStreamWriter (System .out)
196+
197+ val transformer = (buffer : Vector [Char ], cursor : Int ) => {
198+ // underline all non-blank lines
199+
200+ def hl (b : Vector [Char ]): Vector [Char ] = b.flatMap{
201+ case ' ' => " "
202+ case '\n ' => " \n "
203+ case c => Console .UNDERLINED + c + Console .RESET
204+ }
205+ // and highlight the selection
206+ val ansiBuffer = fansi.Str (hl(buffer))
207+ val (newBuffer, cursorOffset) = GUILikeFilters .SelectionFilter .mangleBuffer(
208+ selection, ansiBuffer, cursor, fansi.Reversed .On
209+ )
210+ val newNewBuffer = HistoryFilter .mangleBuffer(
211+ historyFilter, newBuffer, cursor,
212+ fansi.Color .Green
213+ )
214+
215+ (newNewBuffer, cursorOffset)
216+ }
217+
194218 @ tailrec
195219 def loop (): Unit = {
196- Terminal .readLine(" >>" , reader, writer, filters) match {
220+ Terminal .readLine(" >>" , reader, writer, filters, transformer ) match {
197221 case Some (line) => execute(line); loop()
198222 case _ => println(" \n Bye!" ); saveHistory(history)
199223 }
0 commit comments