@@ -7,17 +7,24 @@ import Idris.AbsSyntax
77import Idris.Delaborate
88import Idris.Output
99
10+import Idris.Core.Evaluate (ctxtAlist)
1011import Idris.Core.TT
1112import Idris.Core.Typecheck
1213import Idris.Core.Constraints
14+import Idris.Output
1315
1416import System.Console.Haskeline
1517import System.Console.Haskeline.MonadException
18+import Control.Monad (when)
1619import Control.Monad.State.Strict
1720import Control.Monad.Error (throwError, catchError)
1821import System.IO.Error(isUserError, ioeGetErrorString)
1922import Data.Char
23+import Data.List (intercalate, isPrefixOf)
24+import qualified Data.Text as T
2025import Data.Typeable
26+import qualified Data.Traversable as Traversable
27+import qualified Data.Foldable as Foldable
2128
2229iucheck :: Idris ()
2330iucheck = do tit <- typeInType
@@ -70,3 +77,72 @@ tctry tc1 tc2
7077getErrSpan :: Err -> FC
7178getErrSpan (At fc _) = fc
7279getErrSpan _ = emptyFC
80+
81+--------------------------------------------------------------------
82+-- Specific warnings not included in elaborator
83+--------------------------------------------------------------------
84+-- | Issue a warning on "with"-terms whose namespace is empty or nonexistent
85+warnDisamb :: IState -> PTerm -> Idris ()
86+warnDisamb ist (PQuote _) = return ()
87+warnDisamb ist (PRef _ _) = return ()
88+warnDisamb ist (PInferRef _ _) = return ()
89+warnDisamb ist (PPatvar _ _) = return ()
90+warnDisamb ist (PLam _ t b) = warnDisamb ist t >> warnDisamb ist b
91+warnDisamb ist (PPi _ _ t b) = warnDisamb ist t >> warnDisamb ist b
92+warnDisamb ist (PLet _ x t b) = warnDisamb ist x >> warnDisamb ist t >> warnDisamb ist b
93+warnDisamb ist (PTyped x t) = warnDisamb ist x >> warnDisamb ist t
94+warnDisamb ist (PApp _ t args) = warnDisamb ist t >>
95+ mapM_ (warnDisamb ist . getTm) args
96+warnDisamb ist (PAppBind _ f args) = warnDisamb ist f >>
97+ mapM_ (warnDisamb ist . getTm) args
98+warnDisamb ist (PMatchApp _ _) = return ()
99+warnDisamb ist (PCase _ tm cases) = warnDisamb ist tm >>
100+ mapM_ (\(x,y)-> warnDisamb ist x >> warnDisamb ist y) cases
101+warnDisamb ist (PTrue _ _) = return ()
102+warnDisamb ist (PFalse _) = return ()
103+warnDisamb ist (PRefl _ tm) = warnDisamb ist tm
104+warnDisamb ist (PResolveTC _) = return ()
105+warnDisamb ist (PEq _ a b x y) = warnDisamb ist a >> warnDisamb ist b >>
106+ warnDisamb ist x >> warnDisamb ist y
107+warnDisamb ist (PRewrite _ x y z) = warnDisamb ist x >> warnDisamb ist y >>
108+ Foldable.mapM_ (warnDisamb ist) z
109+warnDisamb ist (PPair _ _ x y) = warnDisamb ist x >> warnDisamb ist y
110+warnDisamb ist (PDPair _ _ x y z) = warnDisamb ist x >> warnDisamb ist y >> warnDisamb ist z
111+warnDisamb ist (PAlternative _ tms) = mapM_ (warnDisamb ist) tms
112+warnDisamb ist (PHidden tm) = warnDisamb ist tm
113+warnDisamb ist PType = return ()
114+warnDisamb ist (PUniverse _) = return ()
115+warnDisamb ist (PGoal _ x _ y) = warnDisamb ist x >> warnDisamb ist y
116+warnDisamb ist (PConstant _) = return ()
117+warnDisamb ist Placeholder = return ()
118+warnDisamb ist (PDoBlock steps) = mapM_ wStep steps
119+ where wStep (DoExp _ x) = warnDisamb ist x
120+ wStep (DoBind _ _ x) = warnDisamb ist x
121+ wStep (DoBindP _ x y cs) = warnDisamb ist x >> warnDisamb ist y >>
122+ mapM_ (\(x,y)-> warnDisamb ist x >> warnDisamb ist y) cs
123+ wStep (DoLet _ _ x y) = warnDisamb ist x >> warnDisamb ist y
124+ wStep (DoLetP _ x y) = warnDisamb ist x >> warnDisamb ist y
125+warnDisamb ist (PIdiom _ x) = warnDisamb ist x
126+warnDisamb ist (PReturn _) = return ()
127+warnDisamb ist (PMetavar _) = return ()
128+warnDisamb ist (PProof tacs) = mapM_ (Foldable.mapM_ (warnDisamb ist)) tacs
129+warnDisamb ist (PTactics tacs) = mapM_ (Foldable.mapM_ (warnDisamb ist)) tacs
130+warnDisamb ist (PElabError _) = return ()
131+warnDisamb ist PImpossible = return ()
132+warnDisamb ist (PCoerced tm) = warnDisamb ist tm
133+warnDisamb ist (PDisamb ds tm) = warnDisamb ist tm >>
134+ mapM_ warnEmpty ds
135+ where warnEmpty d =
136+ when (null (filter (isIn d . fst) (ctxtAlist (tt_ctxt ist)))) $
137+ ierror . Msg $
138+ "Nothing found in namespace \"" ++
139+ intercalate "." (map T.unpack d) ++
140+ "\"."
141+ isIn d (NS _ ns) = isPrefixOf d ns
142+ isIn d _ = False
143+
144+warnDisamb ist (PUnifyLog tm) = warnDisamb ist tm
145+warnDisamb ist (PNoImplicits tm) = warnDisamb ist tm
146+warnDisamb ist (PQuasiquote tm goal) = warnDisamb ist tm >>
147+ Foldable.mapM_ (warnDisamb ist) goal
148+warnDisamb ist (PUnquote tm) = warnDisamb ist tm