{-# 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 Control.Monad.Error (throwError, catchError) import System.IO.Error(isUserError, ioeGetErrorString) import Data.Char import Data.Typeable iucheck :: Idris () iucheck = do tit <- typeInType when (not tit) $ do ist <- getIState (tclift $ ucheck (idris_constraints ist)) `idrisCatch` (\e -> do setErrLine (getErrLine e) iputStrLn (pshow ist e)) showErr :: Err -> Idris String showErr e = getIState >>= return . flip pshow e report :: IOError -> String report e | isUserError e = ioeGetErrorString e | otherwise = show e idrisCatch :: Idris a -> (Err -> Idris a) -> Idris a idrisCatch = catchError setAndReport :: Err -> Idris () setAndReport e = do ist <- getIState let h = idris_outh ist case e of At fc@(FC f l c) e -> do setErrLine l ihWarn h fc $ pshow ist e _ -> do setErrLine (getErrLine e) ihputStrLn h $ pshow ist e ifail :: String -> Idris a ifail = throwError . Msg ierror :: Err -> Idris a ierror = throwError tclift :: TC a -> Idris a tclift (OK v) = return v tclift (Error err@(At (FC f l c) e)) = do setErrLine l ; throwError err tclift (Error err) = throwError err tctry :: TC a -> TC a -> Idris a tctry tc1 tc2 = case tc1 of OK v -> return v Error err -> tclift tc2 getErrLine :: Err -> Int getErrLine (At (FC _ l _) _) = l getErrLine _ = 0 getErrColumn :: Err -> Int getErrColumn (At (FC _ _ c) _) = c getErrColumn _ = 0