Files
newt/src/Lib/Error.newt
Steve Dunham fe96f46534
Some checks failed
Publish Playground / build (push) Has been cancelled
Publish Playground / deploy (push) Has been cancelled
First pass at a scheme backend
2026-03-16 17:03:33 -07:00

38 lines
996 B
Agda

module Lib.Error
import Prelude
import Lib.Common
-- I'll want to get Context / Val in some of these
-- and a pretty printer in the monad
data Error
= E FC String
| ENotInScope FC String
| Postpone FC QName String
instance HasFC Error where
getFC (E x str) = x
getFC (ENotInScope x _) = x
getFC (Postpone x k str) = x
errorMsg : Error -> String
errorMsg (E x str) = str
errorMsg (ENotInScope x nm) = "\{nm} not in scope"
errorMsg (Postpone x k str) = str
showError : (src : String) -> Error -> String
showError src err =
let fc = getFC err
in "ERROR at \{show $ getFC err}: \{errorMsg err}\n" ++ go fc 0 (lines src)
where
go : FC Int List String String
go fc l Nil = ""
go fc l (x :: xs) =
if l == fcLine fc then
let width = fc.bnds.endCol - fc.bnds.startCol in
" \{x}\n \{padding (fcCol fc) ' '}\{padding width '^'}\n"
else if fcLine fc - 3 < l then " " ++ x ++ "\n" ++ go fc (l + 1) xs
else go fc (l + 1) xs