@@ -49,9 +49,18 @@ recheckC fc env t
4949 addConstraints fc cs
5050 return (tm, ty)
5151
52−checkDef fc ns = do ctxt <- getContext
53− mapM (\(n, (i, top, t)) -> do (t', _) <- recheckC fc [] t
54− return (n, (i, top, t'))) ns
52+
53+checkDef fc ns = checkAddDef False True fc ns
54+
55+checkAddDef add toplvl fc [] = return []
56+checkAddDef add toplvl fc ((n, (i, top, t)) : ns)
57+ = do ctxt <- getContext
58+ (t', _) <- recheckC fc [] t
59+ when add $ addDeferred [(n, (i, top, t, toplvl))]
60+ ns' <- checkAddDef add toplvl fc ns
61+ return ((n, (i, top, t')) : ns')
62+-- mapM (\(n, (i, top, t)) -> do (t', _) <- recheckC fc [] t
63+-- return (n, (i, top, t'))) ns
5564
5665-- | Elaborate a top-level type declaration - for example, "foo : Int -> Int".
5766elabType :: ElabInfo -> SyntaxInfo -> String ->
@@ -76,9 +85,12 @@ elabType' norm info syn doc fc opts n ty' = {- let ty' = piBind (params info) ty
7685 ((tyT, defer, is), log) <-
7786 tclift $ elaborate ctxt n (TType (UVal 0)) []
7887 (errAt "type of " n (erun fc (build i info False [] n ty)))
79− ds <- checkDef fc defer
80− let ds' = map (\(n, (i, top, t)) -> (n, (i, top, t, True))) ds
81− addDeferred ds'
88+ ds <- checkAddDef True False fc defer
89+ -- if the type is not complete, note that we'll need to infer
90+ -- things later (for solving metavariables)
91+ when (not (null ds)) $ addTyInferred n
92+-- let ds' = map (\(n, (i, top, t)) -> (n, (i, top, t, True))) ds
93+-- addDeferred ds'
8294 mapM_ (elabCaseBlock info opts) is
8395 ctxt <- getContext
8496 logLvl 5 $ "Rechecking"
@@ -1262,6 +1274,7 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
12621274 -- Build the LHS as an "Infer", and pull out its type and
12631275 -- pattern bindings
12641276 i <- getIState
1277+ inf <- isTyInferred fname
12651278 -- get the parameters first, to pass through to any where block
12661279 let fn_ty = case lookupTy fname (tt_ctxt i) of
12671280 [t] -> t
@@ -1275,16 +1288,25 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
12751288 logLvl 5 ("LHS: " ++ show fc ++ " " ++ showTmImpls lhs)
12761289 logLvl 4 ("Fixed parameters: " ++ show params ++ " from " ++ show (fn_ty, fn_is))
12771290
1278− ((lhs', dlhs, []), _) <-
1291+ (((lhs', dlhs, []), probs), _) <-
12791292 tclift $ elaborate ctxt (sMN 0 "patLHS") infP []
1280− (errAt "left hand side of " fname
1281− (erun fc (buildTC i info True opts fname (infTerm lhs))))
1293+ (do res <- errAt "left hand side of " fname
1294+ (erun fc (buildTC i info True opts fname (infTerm lhs)))
1295+ probs <- get_probs
1296+ return (res, probs))
1297+
1298+ when inf $ addTyInfConstraints fc (map (\(x,y,_,_) -> (x,y)) probs)
1299+
12821300 let lhs_tm = orderPats (getInferTerm lhs')
12831301 let lhs_ty = getInferType lhs'
12841302 logLvl 3 ("Elaborated: " ++ show lhs_tm)
12851303 logLvl 3 ("Elaborated type: " ++ show lhs_ty)
12861304
1287− (clhs_c, clhsty) <- recheckC fc [] lhs_tm
1305+ -- If we're inferring metavariables in the type, don't recheck,
1306+ -- because we're only doing this to try to work out those metavariables
1307+ (clhs_c, clhsty) <- if not inf
1308+ then recheckC fc [] lhs_tm
1309+ else return (lhs_tm, lhs_ty)
12881310 let clhs = normalise ctxt [] clhs_c
12891311
12901312 logLvl 3 ("Normalised LHS: " ++ showTmImpls (delabMV i clhs))
@@ -1319,7 +1341,7 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
13191341 logLvl 2 $ "RHS: " ++ showTmImpls rhs
13201342 ctxt <- getContext -- new context with where block added
13211343 logLvl 5 "STARTING CHECK"
1322− ((rhs', defer, is), _) <-
1344+ ((rhs', defer, is, probs), _) <-
13231345 tclift $ elaborate ctxt (sMN 0 "patRHS") clhsty []
13241346 (do pbinds lhs_tm
13251347 setNextName
@@ -1332,7 +1354,11 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
13321354 mapM_ (elabCaseHole aux) hs
13331355 tt <- get_term
13341356 let (tm, ds) = runState (collectDeferred (Just fname) tt) []
1335− return (tm, ds, is))
1357+ probs <- get_probs
1358+ return (tm, ds, is, probs))
1359+
1360+ when inf $ addTyInfConstraints fc (map (\(x,y,_,_) -> (x,y)) probs)
1361+
13361362 logLvl 5 "DONE CHECK"
13371363 logLvl 2 $ "---> " ++ show rhs'
13381364 when (not (null defer)) $ iLOG $ "DEFERRED " ++ show (map fst defer)
@@ -1352,7 +1378,9 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
13521378 ctxt <- getContext
13531379 logLvl 5 $ "Rechecking"
13541380 logLvl 6 $ " ==> " ++ show (forget rhs')
1355− (crhs, crhsty) <- recheckC fc [] rhs'
1381+ (crhs, crhsty) <- if not inf
1382+ then recheckC fc [] rhs'
1383+ else return (rhs', clhsty)
13561384 logLvl 6 $ " ==> " ++ show crhsty ++ " against " ++ show clhsty
13571385 case converts ctxt [] clhsty crhsty of
13581386 OK _ -> return ()