diff --git a/basis/ui/tools/listener/listener.factor b/basis/ui/tools/listener/listener.factor index b28e3db941..cc6923ab2d 100644 --- a/basis/ui/tools/listener/listener.factor +++ b/basis/ui/tools/listener/listener.factor @@ -321,16 +321,30 @@ M: object accept-completion-hook 2drop ; [ history>> history-add drop ] [ control-value ] [ select-all ] tri parse-lines-interactive ; -: ( error continuation -- popup ) - over compute-restarts [ hide-glass ] +: do-recall? ( table error -- ? ) + [ selection>> value>> not ] [ lexer-error? ] bi* and ; + +: recall-lexer-error ( interactor error -- ) + over recall-previous go-to-error ; + +: make-restart-hook-quot ( error interactor -- quot ) + over '[ + dup hide-glass + _ do-recall? [ _ _ recall-lexer-error ] when + ] ; + +: frame-debugger ( debugger -- labeled ) "Error" debugger-color ; -: recall-on-lexer-error ( interactor error -- ) - dup lexer-error? [ over recall-previous go-to-error ] [ 2drop ] if ; +:: ( error continuation interactor -- popup ) + error + continuation + error compute-restarts + error interactor make-restart-hook-quot + frame-debugger ; : debugger-popup ( interactor error continuation -- ) - 2over recall-on-lexer-error - [ one-line-elt ] 2dip show-listener-popup ; + pick one-line-elt swap show-listener-popup ; : try-parse ( lines -- quot/f ) [ parse-lines-interactive ] [ nip '[ _ rethrow ] ] recover ;