@@ -38,10 +38,10 @@ toplevel = EInfo [] emptyContext id Nothing
3838
3939-- Also find deferred names in the term and their types
4040
41−build :: IState -> ElabInfo -> Bool -> Name -> PTerm ->
41+build :: IState -> ElabInfo -> Bool -> FnOpts -> Name -> PTerm ->
4242 ElabD (Term, [(Name, (Int, Maybe Name, Type))], [PDecl])
43−build ist info pattern fn tm
44− = do elab ist info pattern False fn tm
43+build ist info pattern opts fn tm
44+ = do elab ist info pattern opts fn tm
4545 ivs <- get_instances
4646 hs <- get_holes
4747 ptm <- get_term
@@ -78,10 +78,10 @@ build ist info pattern fn tm
7878-- (Separate, so we don't go overboard resolving things that we don't
7979-- know about yet on the LHS of a pattern def)
8080
81−buildTC :: IState -> ElabInfo -> Bool -> Bool -> Name -> PTerm ->
81+buildTC :: IState -> ElabInfo -> Bool -> FnOpts -> Name -> PTerm ->
8282 ElabD (Term, [(Name, (Int, Maybe Name, Type))], [PDecl])
83−buildTC ist info pattern tcgen fn tm
84− = do elab ist info pattern tcgen fn tm
83+buildTC ist info pattern opts fn tm
84+ = do elab ist info pattern opts fn tm
8585 probs <- get_probs
8686 tm <- get_term
8787 case probs of
@@ -97,19 +97,22 @@ buildTC ist info pattern tcgen fn tm
9797-- Returns the set of declarations we need to add to complete the definition
9898-- (most likely case blocks to elaborate)
9999
100−elab :: IState -> ElabInfo -> Bool -> Bool -> Name -> PTerm ->
100+elab :: IState -> ElabInfo -> Bool -> FnOpts -> Name -> PTerm ->
101101 ElabD ()
102−elab ist info pattern tcgen fn tm
102+elab ist info pattern opts fn tm
103103 = do let loglvl = opt_logLevel (idris_options ist)
104104 when (loglvl > 5) $ unifyLog True
105105 compute -- expand type synonyms, etc
106− elabE (False, False) tm -- (in argument, guarded)
106+ elabE (False, False, False) tm -- (in argument, guarded, in type)
107107 end_unify
108108 when pattern -- convert remaining holes to pattern vars
109109 (do update_term orderPats
110110 tm <- get_term
111111 mkPat)
112112 where
113+ tcgen = Dictionary `elem` opts
114+ reflect = Reflection `elem` opts
115+
113116 isph arg = case getTm arg of
114117 Placeholder -> (True, priority arg)
115118 _ -> (False, priority arg)
@@ -128,6 +131,7 @@ elab ist info pattern tcgen fn tm
128131 (h: hs) -> do patvar h; mkPat
129132 [] -> return ()
130133
134+ elabE :: (Bool, Bool, Bool) -> PTerm -> ElabD ()
131135 elabE ina t = {- do g <- goal
132136 tm <- get_term
133137 trace ("Elaborating " ++ show t ++ " : " ++ show g ++ "\n\tin " ++ show tm)
@@ -147,9 +151,18 @@ elab ist info pattern tcgen fn tm
147151
148152 local f = do e <- get_env
149153 return (f `elem` map fst e)
154+
155+ constType (AType _) = True
156+ constType StrType = True
157+ constType PtrType = True
158+ constType VoidType = True
159+ constType _ = False
150160
151161 elab' ina (PNoImplicits t) = elab' ina t -- skip elabE step
152162 elab' ina PType = do apply RType []; solve
163+ elab' (_,_,inty) (PConstant c)
164+ | constType c && pattern && not reflect && not inty
165+ = lift $ tfail (Msg "Typecase is not allowed")
153166 elab' ina (PConstant c) = do apply (RConstant c) []; solve
154167 elab' ina (PQuote r) = do fill r; solve
155168 elab' ina (PTrue fc) = try (elab' ina (PRef fc unitCon))
@@ -171,13 +184,13 @@ elab ist info pattern tcgen fn tm
171184 [pimp (MN 0 "a") Placeholder True,
172185 pimp (MN 0 "b") Placeholder False,
173186 pexp l, pexp r])
174− elab' ina@(_, a) (PPair fc l r)
187+ elab' ina@(_, a, inty) (PPair fc l r)
175188 = do hnf_compute
176189 g <- goal
177190 case g of
178− TType _ -> elabE (True, a) (PApp fc (PRef fc pairTy)
179− [pexp l,pexp r])
180− _ -> elabE (True, a) (PApp fc (PRef fc pairCon)
191+ TType _ -> elabE (True, a,inty) (PApp fc (PRef fc pairTy)
192+ [pexp l,pexp r])
193+ _ -> elabE (True, a, inty) (PApp fc (PRef fc pairCon)
181194 [pimp (MN 0 "A") Placeholder True,
182195 pimp (MN 0 "B") Placeholder True,
183196 pexp l, pexp r])
@@ -225,7 +238,10 @@ elab ist info pattern tcgen fn tm
225238 trySeq' deferr (x : xs)
226239 = try' (elab' ina x) (trySeq' deferr xs) True
227240 elab' ina (PPatvar fc n) | pattern = patvar n
228− elab' (ina, guarded) (PRef fc n) | pattern && not (inparamBlock n)
241+ elab' (_, _, inty) (PRef fc f)
242+ | isTConName f (tt_ctxt ist) && pattern && not reflect && not inty
243+ = lift $ tfail (Msg "Typecase is not allowed")
244+ elab' (ina, guarded, inty) (PRef fc n) | pattern && not (inparamBlock n)
229245 = do ctxt <- get_context
230246 let defined = case lookupTy n ctxt of
231247 [] -> False
@@ -242,7 +258,7 @@ elab ist info pattern tcgen fn tm
242258 _ -> True
243259 elab' ina f@(PInferRef fc n) = elab' ina (PApp fc f [])
244260 elab' ina (PRef fc n) = erun fc $ do apply (Var n) []; solve
245− elab' ina@(_, a) (PLam n Placeholder sc)
261+ elab' ina@(_, a, inty) (PLam n Placeholder sc)
246262 = do -- n' <- unique_hole n
247263 -- let sc' = mapPT (repN n n') sc
248264 ptm <- get_term
@@ -250,10 +266,10 @@ elab ist info pattern tcgen fn tm
250266 checkPiGoal n
251267 attack; intro (Just n);
252268 -- trace ("------ intro " ++ show n ++ " ---- \n" ++ show ptm)
253− elabE (True, a) sc; solve
269+ elabE (True, a, inty) sc; solve
254270 where repN n n' (PRef fc x) | x == n' = PRef fc n'
255271 repN _ _ t = t
256− elab' ina@(_, a) (PLam n ty sc)
272+ elab' ina@(_, a, inty) (PLam n ty sc)
257273 = do hsin <- get_holes
258274 ptmin <- get_term
259275 tyn <- unique_hole (MN 0 "lamty")
@@ -268,12 +284,12 @@ elab ist info pattern tcgen fn tm
268284 introTy (Var tyn) (Just n)
269285 -- end_unify
270286 focus tyn
271− elabE (True, a) ty
272− elabE (True, a) sc
287+ elabE (True, a, True) ty
288+ elabE (True, a, inty) sc
273289 solve
274− elab' ina@(_,a) (PPi _ n Placeholder sc)
275− = do attack; arg n (MN 0 "ty"); elabE (True, a) sc; solve
276− elab' ina@(_,a) (PPi _ n ty sc)
290+ elab' ina@(_, a, _) (PPi _ n Placeholder sc)
291+ = do attack; arg n (MN 0 "ty"); elabE (True, a, True) sc; solve
292+ elab' ina@(_, a, _) (PPi _ n ty sc)
277293 = do attack; tyn <- unique_hole (MN 0 "ty")
278294 claim tyn RType
279295 n' <- case n of
@@ -281,10 +297,10 @@ elab ist info pattern tcgen fn tm
281297 _ -> return n
282298 forall n' (Var tyn)
283299 focus tyn
284− elabE (True, a) ty
285− elabE (True, a) sc
300+ elabE (True, a, True) ty
301+ elabE (True, a, True) sc
286302 solve
287− elab' ina@(_,a) (PLet n ty val sc)
303+ elab' ina@(_, a, inty) (PLet n ty val sc)
288304 = do attack;
289305 tyn <- unique_hole (MN 0 "letty")
290306 claim tyn RType
@@ -296,17 +312,17 @@ elab ist info pattern tcgen fn tm
296312 Placeholder -> return ()
297313 _ -> do focus tyn
298314 explicit tyn
299− elabE (True, a) ty
315+ elabE (True, a, True) ty
300316 focus valn
301− elabE (True, a) val
317+ elabE (True, a, True) val
302318 env <- get_env
303− elabE (True, a) sc
319+ elabE (True, a, inty) sc
304320 -- HACK: If the name leaks into its type, it may leak out of
305321 -- scope outside, so substitute in the outer scope.
306322 expandLet n (case lookup n env of
307323 Just (Let t v) -> v)
308324 solve
309− elab' ina@(_,a) (PGoal fc r n sc) = do
325+ elab' ina@(_, a, inty) (PGoal fc r n sc) = do
310326 rty <- goal
311327 attack
312328 tyn <- unique_hole (MN 0 "letty")
@@ -315,10 +331,10 @@ elab ist info pattern tcgen fn tm
315331 claim valn (Var tyn)
316332 letbind n (Var tyn) (Var valn)
317333 focus valn
318− elabE (True, a) (PApp fc r [pexp (delab ist rty)])
334+ elabE (True, a, True) (PApp fc r [pexp (delab ist rty)])
319335 env <- get_env
320336 computeLet n
321− elabE (True, a) sc
337+ elabE (True, a, inty) sc
322338 solve
323339-- elab' ina (PLet n Placeholder
324340-- (PApp fc r [pexp (delab ist rty)]) sc)
@@ -368,14 +384,17 @@ elab ist info pattern tcgen fn tm
368384 Just xs@(_:_) -> NS n xs
369385 _ -> n
370386
371− elab' (ina, g) (PMatchApp fc fn)
387+ elab' ina (PMatchApp fc fn)
372388 = do (fn', imps) <- case lookupCtxtName fn (idris_implicits ist) of
373389 [(n, args)] -> return (n, map (const True) args)
374390 _ -> lift $ tfail (NoSuchVariable fn)
375391 ns <- match_apply (Var fn') (map (\x -> (x,0)) imps)
376392 solve
393+ elab' (_, _, inty) (PApp fc (PRef _ f) args')
394+ | isTConName f (tt_ctxt ist) && pattern && not reflect && not inty
395+ = lift $ tfail (Msg "Typecase is not allowed")
377396 -- if f is local, just do a simple_app
378− elab' (ina, g) tm@(PApp fc (PRef _ f) args')
397+ elab' (ina, g, inty) tm@(PApp fc (PRef _ f) args')
379398 = do let args = {- case lookupCtxt f (inblock info) of
380399 Just ps -> (map (pexp . (PRef fc)) ps ++ args')
381400 _ -> -} args'
@@ -383,8 +402,8 @@ elab ist info pattern tcgen fn tm
383402 env <- get_env
384403 if (f `elem` map fst env && length args' == 1)
385404 then -- simple app, as below
386− do simple_app (elabE (ina, g) (PRef fc f))
387− (elabE (True, g) (getTm (head args')))
405+ do simple_app (elabE (ina, g, inty) (PRef fc f))
406+ (elabE (True, g, inty) (getTm (head args')))
388407 (show tm)
389408 solve
390409 else
@@ -408,7 +427,7 @@ elab ist info pattern tcgen fn tm
408427 sortBy (\(_,x) (_,y) ->
409428 compare (priority x) (priority y))
410429 (zip ns args)
411− elabArgs (ina || not isinf, guarded)
430+ elabArgs (ina || not isinf, guarded, inty)
412431 [] fc False ns' (map (\x -> (lazyarg x, getTm x)) eargs)
413432 mkSpecialised ist fc f (map getTm args') tm
414433 solve
@@ -439,9 +458,9 @@ elab ist info pattern tcgen fn tm
439458 setInjective (PApp _ (PRef _ n) _) = setinj n
440459 setInjective _ = return ()
441460
442− elab' ina@(_, a) tm@(PApp fc f [arg])
461+ elab' ina@(_, a, inty) tm@(PApp fc f [arg])
443462 = erun fc $
444− do simple_app (elabE ina f) (elabE (True, a) (getTm arg))
463+ do simple_app (elabE ina f) (elabE (True, a, inty) (getTm arg))
445464 (show tm)
446465 solve
447466 elab' ina Placeholder = do (h : hs) <- get_holes
@@ -490,7 +509,7 @@ elab ist info pattern tcgen fn tm
490509 elab' ina sc
491510 elab' ina (PRef fc letn)
492511 solve
493− elab' ina@(_, a) c@(PCase fc scr opts)
512+ elab' ina@(_, a, inty) c@(PCase fc scr opts)
494513 = do attack
495514 tyn <- unique_hole (MN 0 "scty")
496515 claim tyn RType
@@ -499,7 +518,7 @@ elab ist info pattern tcgen fn tm
499518 claim valn (Var tyn)
500519 letbind scvn (Var tyn) (Var valn)
501520 focus valn
502− elabE (True, a) scr
521+ elabE (True, a, inty) scr
503522 args <- get_env
504523 cname <- unique_hole' True (mkCaseName fn)
505524 let cname' = mkN cname
@@ -682,9 +701,9 @@ findInstances ist t
682701 | otherwise = []
683702
684703trivial' ist
685− = trivial (elab ist toplevel False False (MN 0 "tac")) ist
704+ = trivial (elab ist toplevel False [] (MN 0 "tac")) ist
686705proofSearch' ist top n hints
687− = proofSearch (elab ist toplevel False False (MN 0 "tac")) top n hints ist
706+ = proofSearch (elab ist toplevel False [] (MN 0 "tac")) top n hints ist
688707
689708
690709resolveTC :: Int -> Term -> Name -> IState -> ElabD ()
@@ -813,7 +832,7 @@ runTac autoSolve ist tac
813832 where
814833 bname (Bind n _ _) = Just n
815834 bname _ = Nothing
816− runT (Exact tm) = do elab ist toplevel False False (MN 0 "tac") tm
835+ runT (Exact tm) = do elab ist toplevel False [] (MN 0 "tac") tm
817836 when autoSolve solveAll
818837 runT (MatchRefine fn)
819838 = do fnimps <-
@@ -860,7 +879,7 @@ runTac autoSolve ist tac
860879 letn <- unique_hole (MN 0 "equiv_val")
861880 letbind letn (Var tyn) (Var valn)
862881 focus tyn
863− elab ist toplevel False False (MN 0 "tac") tm
882+ elab ist toplevel False [] (MN 0 "tac") tm
864883 focus valn
865884 when autoSolve solveAll
866885 runT (Rewrite tm) -- to elaborate tm, let bind it, then rewrite by that
@@ -873,7 +892,7 @@ runTac autoSolve ist tac
873892 letn <- unique_hole (MN 0 "rewrite_rule")
874893 letbind letn (Var tyn) (Var valn)
875894 focus valn
876− elab ist toplevel False False (MN 0 "tac") tm
895+ elab ist toplevel False [] (MN 0 "tac") tm
877896 rewrite (Var letn)
878897 when autoSolve solveAll
879898 runT (Induction nm)
@@ -888,7 +907,7 @@ runTac autoSolve ist tac
888907 letn <- unique_hole n
889908 letbind letn (Var tyn) (Var valn)
890909 focus valn
891− elab ist toplevel False False (MN 0 "tac") tm
910+ elab ist toplevel False [] (MN 0 "tac") tm
892911 when autoSolve solveAll
893912 runT (LetTacTy n ty tm)
894913 = do attack
@@ -899,9 +918,9 @@ runTac autoSolve ist tac
899918 letn <- unique_hole n
900919 letbind letn (Var tyn) (Var valn)
901920 focus tyn
902− elab ist toplevel False False (MN 0 "tac") ty
921+ elab ist toplevel False [] (MN 0 "tac") ty
903922 focus valn
904− elab ist toplevel False False (MN 0 "tac") tm
923+ elab ist toplevel False [] (MN 0 "tac") tm
905924 when autoSolve solveAll
906925 runT Compute = compute
907926 runT Trivial = do trivial' ist; when autoSolve solveAll
@@ -919,7 +938,7 @@ runTac autoSolve ist tac
919938 scriptvar <- unique_hole (MN 0 "scriptvar" )
920939 letbind scriptvar scriptTy (Var script)
921940 focus script
922− elab ist toplevel False False (MN 0 "tac") tm
941+ elab ist toplevel False [] (MN 0 "tac") tm
923942 (script', _) <- get_type_val (Var scriptvar)
924943 -- now that we have the script apply
925944 -- it to the reflected goal and context
@@ -952,7 +971,7 @@ runTac autoSolve ist tac
952971 letbind scriptvar scriptTy (Var script)
953972 focus script
954973 ptm <- get_term
955− elab ist toplevel False False (MN 0 "tac")
974+ elab ist toplevel False [] (MN 0 "tac")
956975 (PApp emptyFC tm [pexp (delabTy' ist [] tgoal True True)])
957976 (script', _) <- get_type_val (Var scriptvar)
958977 -- now that we have the script apply
@@ -980,7 +999,7 @@ runTac autoSolve ist tac
980999 letn <- unique_hole (MN 0 "letvar")
9811000 letbind letn (Var tyn) (Var valn)
9821001 focus valn
983− elab ist toplevel False False (MN 0 "tac") v
1002+ elab ist toplevel False [] (MN 0 "tac") v
9841003 (value, _) <- get_type_val (Var letn)
9851004 ctxt <- get_context
9861005 env <- get_env
@@ -994,7 +1013,7 @@ runTac autoSolve ist tac
9941013 letn <- unique_hole (MN 0 "letvar")
9951014 letbind letn (Var tyn) (Var valn)
9961015 focus valn
997− elab ist toplevel False False (MN 0 "tac") v
1016+ elab ist toplevel False [] (MN 0 "tac") v
9981017 (value, _) <- get_type_val (Var letn)
9991018 ctxt <- get_context
10001019 env <- get_env