@@ -9,6 +9,8 @@ import Core.Elaborate
99import Core.Evaluate
1010import Core.Typecheck
1111
12+import Control.Monad
13+
1214elabType :: Name -> PTerm -> Idris ()
1315elabType n ty
1416 = do ctxt <- getContext
@@ -38,10 +40,38 @@ elabCon (n, t)
3840 return (n, cty)
3941
4042elabClauses :: [PClause] -> Idris ()
41−elabClauses _ = return ()
43+elabClauses cs = do pats <- mapM elabClause cs
44+ iLOG (showSep "\n" (map (\ (l,r) ->
45+ show l ++ " = " ++
46+ show r) pats))
47+
48+elabClause :: PClause -> Idris (Term, Term)
49+elabClause (PClause _ lhs rhs)
50+ = do ctxt <- getContext
51+ (lhs', _) <- tclift $ elaborate ctxt (MN 0 "patLHS") infP
52+ (build True (infTerm lhs))
53+ let lhs_tm = getInferTerm lhs'
54+ let lhs_ty = getInferType lhs'
55+ (clhs, clhsty) <- tclift $ recheck ctxt [] lhs_tm
56+ (rhs', _) <- tclift $ elaborate ctxt (MN 0 "patRHS") infP
57+ (do pbinds lhs_tm
58+ build False (infTerm rhs)
59+ psolve lhs_tm
60+ get_term)
61+ let rhs_tm = getInferTerm rhs'
62+ let rhs_ty = getInferType rhs'
63+ (crhs, crhsty) <- tclift $ recheck ctxt [] rhs_tm
64+ iLOG $ show clhsty
65+ iLOG $ show crhsty
66+ tclift $ converts ctxt [] clhsty crhsty
67+ return (clhs, crhs)
68+ where
69+ pbinds (Bind n (PVar t) sc) = do attack; patbind n (forget t)
70+ pbinds sc
71+ pbinds tm = return ()
4272
43−elabClause :: PClause -> Idris ()
44−elabClause _ = return ()
73+ psolve (Bind n (PVar t) sc) = do solve; psolve sc
74+ psolve tm = return ()
4575
4676elabDecl :: PDecl -> Idris ()
4777elabDecl d = idrisCatch (elabDecl' d) (\e -> iputStrLn (show e))
@@ -65,11 +95,18 @@ build pattern tm = do elab pattern tm
6595 get_term
6696
6797elab :: Bool -> PTerm -> Elab ()
68−elab pattern tm = elab' tm
98+elab pattern tm = do elab' tm
99+ when pattern -- convert remaining holes to pattern vars
100+ mkPat
69101 where
70102 isph (_, Placeholder) = True
71103 isph _ = False
72104
105+ mkPat = do hs <- get_holes
106+ case hs of
107+ (h: hs) -> do patvar h; mkPat
108+ [] -> return ()
109+
73110 elab' PSet = do exact (RSet 0); solve
74111 elab' (PQuote r) = do exact r; solve
75112 elab' (PRef n) | pattern