1{-# LANGUAGE DeriveDataTypeable #-}
2{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
4module Idris.Error where
6import Prelude hiding (catch)
10import Idris.Core.Evaluate (ctxtAlist)
12import Idris.Core.Typecheck
13import Idris.Core.Constraints
16import System.Console.Haskeline
17import System.Console.Haskeline.MonadException
18import Control.Monad (when)
19import Control.Monad.State.Strict
20import System.IO.Error(isUserError, ioeGetErrorString)
22import Data.List (intercalate, isPrefixOf)
23import qualified Data.Text as T
25import qualified Data.Traversable as Traversable
26import qualified Data.Foldable as Foldable
29iucheck = do tit <- typeInType
31 let cs = idris_constraints ist
32 logLvl 7 $ "ALL CONSTRAINTS: " ++ show cs
34 (tclift $ ucheck (idris_constraints ist)) `idrisCatch`
35 (\e -> do let fc = getErrSpan e
37 iWarn fc $ pprintErr ist e)
39showErr :: Err -> Idris String
40showErr e = getIState >>= return . flip pshow e
43report :: IOError -> String
45 | isUserError e = ioeGetErrorString e
48idrisCatch :: Idris a -> (Err -> Idris a) -> Idris a
49idrisCatch = catchError
52setAndReport :: Err -> Idris ()
53setAndReport e = do ist <- getIState
55 At fc e -> do setErrSpan fc
56 iWarn fc $ pprintErr ist e
57 _ -> do setErrSpan (getErrSpan e)
58 iWarn emptyFC $ pprintErr ist e
59 where unwrap (ProofSearchFail e) = e -- remove bookkeeping constructor
62ifail :: String -> Idris a
63ifail = throwError . Msg
65ierror :: Err -> Idris a
68tclift :: TC a -> Idris a
69tclift (OK v) = return v
70tclift (Error err@(At fc e)) = do setErrSpan fc; throwError err
71tclift (Error err@(UniverseError fc _ _ _ _)) = do setErrSpan fc; throwError err
72tclift (Error err) = throwError err
74tctry :: TC a -> TC a -> Idris a
78 Error err -> tclift tc2
80getErrSpan :: Err -> FC
81getErrSpan (At fc _) = fc
82getErrSpan (UniverseError fc _ _ _ _) = fc
85--------------------------------------------------------------------
86-- Specific warnings not included in elaborator
87--------------------------------------------------------------------
88-- | Issue a warning on "with"-terms whose namespace is empty or nonexistent
89warnDisamb :: IState -> PTerm -> Idris ()
90warnDisamb ist (PQuote _) = return ()
91warnDisamb ist (PRef _ _) = return ()
92warnDisamb ist (PInferRef _ _) = return ()
93warnDisamb ist (PPatvar _ _) = return ()
94warnDisamb ist (PLam _ _ t b) = warnDisamb ist t >> warnDisamb ist b
95warnDisamb ist (PPi _ _ t b) = warnDisamb ist t >> warnDisamb ist b
96warnDisamb ist (PLet _ _ x t b) = warnDisamb ist x >> warnDisamb ist t >> warnDisamb ist b
97warnDisamb ist (PTyped x t) = warnDisamb ist x >> warnDisamb ist t
98warnDisamb ist (PApp _ t args) = warnDisamb ist t >>
99 mapM_ (warnDisamb ist . getTm) args
100warnDisamb ist (PAppBind _ f args) = warnDisamb ist f >>
101 mapM_ (warnDisamb ist . getTm) args
102warnDisamb ist (PMatchApp _ _) = return ()
103warnDisamb ist (PCase _ tm cases) = warnDisamb ist tm >>
104 mapM_ (\(x,y)-> warnDisamb ist x >> warnDisamb ist y) cases
105warnDisamb ist (PTrue _ _) = return ()
106warnDisamb ist (PRefl _ tm) = warnDisamb ist tm
107warnDisamb ist (PResolveTC _) = return ()
108warnDisamb ist (PEq _ a b x y) = warnDisamb ist a >> warnDisamb ist b >>
109 warnDisamb ist x >> warnDisamb ist y
110warnDisamb ist (PRewrite _ x y z) = warnDisamb ist x >> warnDisamb ist y >>
111 Foldable.mapM_ (warnDisamb ist) z
112warnDisamb ist (PPair _ _ x y) = warnDisamb ist x >> warnDisamb ist y
113warnDisamb ist (PDPair _ _ x y z) = warnDisamb ist x >> warnDisamb ist y >> warnDisamb ist z
114warnDisamb ist (PAlternative _ tms) = mapM_ (warnDisamb ist) tms
115warnDisamb ist (PHidden tm) = warnDisamb ist tm
116warnDisamb ist PType = return ()
117warnDisamb ist (PUniverse _) = return ()
118warnDisamb ist (PGoal _ x _ y) = warnDisamb ist x >> warnDisamb ist y
119warnDisamb ist (PConstant _) = return ()
120warnDisamb ist Placeholder = return ()
121warnDisamb ist (PDoBlock steps) = mapM_ wStep steps
122 where wStep (DoExp _ x) = warnDisamb ist x
123 wStep (DoBind _ _ x) = warnDisamb ist x
124 wStep (DoBindP _ x y cs) = warnDisamb ist x >> warnDisamb ist y >>
125 mapM_ (\(x,y)-> warnDisamb ist x >> warnDisamb ist y) cs
126 wStep (DoLet _ _ x y) = warnDisamb ist x >> warnDisamb ist y
127 wStep (DoLetP _ x y) = warnDisamb ist x >> warnDisamb ist y
128warnDisamb ist (PIdiom _ x) = warnDisamb ist x
129warnDisamb ist (PReturn _) = return ()
130warnDisamb ist (PMetavar _) = return ()
131warnDisamb ist (PProof tacs) = mapM_ (Foldable.mapM_ (warnDisamb ist)) tacs
132warnDisamb ist (PTactics tacs) = mapM_ (Foldable.mapM_ (warnDisamb ist)) tacs
133warnDisamb ist (PElabError _) = return ()
134warnDisamb ist PImpossible = return ()
135warnDisamb ist (PCoerced tm) = warnDisamb ist tm
136warnDisamb ist (PDisamb ds tm) = warnDisamb ist tm >>
139 when (null (filter (isIn d . fst) (ctxtAlist (tt_ctxt ist)))) $
141 "Nothing found in namespace \"" ++
142 intercalate "." (map T.unpack d) ++
144 isIn d (NS _ ns) = isPrefixOf d ns
147warnDisamb ist (PUnifyLog tm) = warnDisamb ist tm
148warnDisamb ist (PNoImplicits tm) = warnDisamb ist tm
149warnDisamb ist (PQuasiquote tm goal) = warnDisamb ist tm >>
150 Foldable.mapM_ (warnDisamb ist) goal
151warnDisamb ist (PUnquote tm) = warnDisamb ist tm
152warnDisamb ist (PQuoteName _) = return ()
153warnDisamb ist (PAs _ _ tm) = warnDisamb ist tm
154warnDisamb ist (PAppImpl tm _) = warnDisamb ist tm
155warnDisamb ist (PRunElab _ tm) = warnDisamb ist tm
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list