@@ -79,7 +79,7 @@ private[codegen] object Repl {
79
79
override def execute (): String = {
80
80
val abiDef =
81
81
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
83
83
if (abiDef.outputs.get.exists(_.isTupleTpe)) throw new InvalidCommandException (" tuple type unsupported now" )
84
84
val types = abiDef.outputs.get.map(_.tpe.toString)
85
85
def helper [T ]: Option [T ] = None
@@ -165,35 +165,59 @@ private[codegen] object Repl {
165
165
166
166
def execute (raw : String ): Unit = {
167
167
try {
168
+ history = history :+ raw
168
169
parseCmd(raw) match {
169
170
case cmd : Load => ctx = cmd.execute()
170
171
case cmd : EncodeArg => println(cmd.copy(defs = ctx).execute())
171
172
case cmd : DecodeRet => println(cmd.copy(defs = ctx).execute())
172
173
case cmd : Command => cmd.execute()
173
174
}
174
- history = history :+ raw
175
175
} catch {
176
176
case NonFatal (exp) => println(exp)
177
177
case e : Throwable => throw e
178
178
}
179
179
}
180
180
181
181
// TODO: remove unnecessary filters
182
+ val historyFilter = new HistoryFilter (() => history.toVector, fansi.Attrs .Empty )
183
+ val selection = GUILikeFilters .SelectionFilter (indent = 4 )
182
184
val filters = Filter .merge(
183
185
UndoFilter (),
184
186
ReadlineFilters .CutPasteFilter (),
185
- new HistoryFilter (() => history.toVector, fansi. Attrs . Empty ) ,
186
- GUILikeFilters . SelectionFilter (indent = 4 ) ,
187
+ historyFilter ,
188
+ selection ,
187
189
BasicFilters .tabFilter(4 ),
188
190
GUILikeFilters .altFilter,
189
191
GUILikeFilters .fnFilter,
190
192
ReadlineFilters .navFilter,
191
193
BasicFilters .all)
192
194
val reader = new InputStreamReader (System .in)
193
195
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
+
194
218
@ tailrec
195
219
def loop (): Unit = {
196
- Terminal .readLine(" >>" , reader, writer, filters) match {
220
+ Terminal .readLine(" >>" , reader, writer, filters, transformer ) match {
197
221
case Some (line) => execute(line); loop()
198
222
case _ => println(" \n Bye!" ); saveHistory(history)
199
223
}
0 commit comments