idris-0.9.6.1: src/Idris/Error.hs
{-# LANGUAGE DeriveDataTypeable #-}
module Idris.Error where
import Prelude hiding (catch)
import Idris.AbsSyntax
import Idris.Delaborate
import Core.TT
import Core.Typecheck
import Core.Constraints
import System.Console.Haskeline
import System.Console.Haskeline.MonadException
import Control.Monad.State
import System.IO.Error(isUserError, ioeGetErrorString)
import Data.Char
import Data.Typeable
iucheck :: Idris ()
iucheck = do tit <- typeInType
when (not tit) $
do ist <- getIState
idrisCatch (tclift $ ucheck (idris_constraints ist))
(\e -> do let msg = show e
setErrLine (getErrLine msg)
iputStrLn msg)
report :: IOError -> String
report e
| isUserError e = ioeGetErrorString e
| otherwise = show e
idrisCatch :: Idris a -> (SomeException -> Idris a) -> Idris a
idrisCatch = catch
data IdrisErr = IErr String
deriving Typeable
instance Show IdrisErr where
show (IErr s) = s
instance Exception IdrisErr
ifail :: String -> Idris ()
ifail str = throwIO (IErr str)
ierror :: Err -> Idris ()
ierror err = do i <- getIState
throwIO (IErr $ pshow i err)
tclift :: TC a -> Idris a
tclift tc = case tc of
OK v -> return v
Error err -> do i <- getIState
case err of
At (FC f l) e -> setErrLine l
_ -> return ()
throwIO (IErr $ pshow i err)
tctry :: TC a -> TC a -> Idris a
tctry tc1 tc2
= case tc1 of
OK v -> return v
Error err -> tclift tc2
getErrLine str
= case span (/=':') str of
(_, ':':rest) -> case span isDigit rest of
([], _) -> 0
(num, _) -> read num
_ -> 0