@@ -50,14 +50,14 @@ recheckC fc env t
50 return (tm, ty)
50 return (tm, ty)
53−checkDef fc ns = checkAddDef False fc ns
53+checkDef fc ns = checkAddDef False True fc ns
55−checkAddDef add fc [] = return []
55+checkAddDef add toplvl fc [] = return []
56−checkAddDef add fc ((n, (i, top, t)) : ns)
56+checkAddDef add toplvl fc ((n, (i, top, t)) : ns)
57 = do ctxt <- getContext
57 = do ctxt <- getContext
58 (t', _) <- recheckC fc [] t
58 (t', _) <- recheckC fc [] t
59− when add $ addDeferred [(n, (i, top, t, True))]
59+ when add $ addDeferred [(n, (i, top, t, toplvl))]
60− ns' <- checkAddDef add fc ns
60+ ns' <- checkAddDef add toplvl fc ns
61 return ((n, (i, top, t')) : ns')
61 return ((n, (i, top, t')) : ns')
62-- mapM (\(n, (i, top, t)) -> do (t', _) <- recheckC fc [] t
62-- mapM (\(n, (i, top, t)) -> do (t', _) <- recheckC fc [] t
63-- return (n, (i, top, t'))) ns
63-- return (n, (i, top, t'))) ns
@@ -85,7 +85,10 @@ elabType' norm info syn doc fc opts n ty' = {- let ty' = piBind (params info) ty
85 ((tyT, defer, is), log) <-
85 ((tyT, defer, is), log) <-
86 tclift $ elaborate ctxt n (TType (UVal 0)) []
86 tclift $ elaborate ctxt n (TType (UVal 0)) []
87 (errAt "type of " n (erun fc (build i info False [] n ty)))
87 (errAt "type of " n (erun fc (build i info False [] n ty)))
88− ds <- checkAddDef True fc defer
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
89-- let ds' = map (\(n, (i, top, t)) -> (n, (i, top, t, True))) ds
92-- let ds' = map (\(n, (i, top, t)) -> (n, (i, top, t, True))) ds
90-- addDeferred ds'
93-- addDeferred ds'
91 mapM_ (elabCaseBlock info opts) is
94 mapM_ (elabCaseBlock info opts) is
@@ -1271,6 +1274,7 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
1271 -- Build the LHS as an "Infer", and pull out its type and
1274 -- Build the LHS as an "Infer", and pull out its type and
1272 -- pattern bindings
1275 -- pattern bindings
1273 i <- getIState
1276 i <- getIState
1277+ inf <- isTyInferred fname
1274 -- get the parameters first, to pass through to any where block
1278 -- get the parameters first, to pass through to any where block
1275 let fn_ty = case lookupTy fname (tt_ctxt i) of
1279 let fn_ty = case lookupTy fname (tt_ctxt i) of
1276 [t] -> t
1280 [t] -> t
@@ -1284,16 +1288,25 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
1284 logLvl 5 ("LHS: " ++ show fc ++ " " ++ showTmImpls lhs)
1288 logLvl 5 ("LHS: " ++ show fc ++ " " ++ showTmImpls lhs)
1285 logLvl 4 ("Fixed parameters: " ++ show params ++ " from " ++ show (fn_ty, fn_is))
1289 logLvl 4 ("Fixed parameters: " ++ show params ++ " from " ++ show (fn_ty, fn_is))
1287− ((lhs', dlhs, []), _) <-
1291+ (((lhs', dlhs, []), probs), _) <-
1288 tclift $ elaborate ctxt (sMN 0 "patLHS") infP []
1292 tclift $ elaborate ctxt (sMN 0 "patLHS") infP []
1289− (errAt "left hand side of " fname
1293+ (do res <- errAt "left hand side of " fname
1290− (erun fc (buildTC i info True opts fname (infTerm lhs))))
1294+ (erun fc (buildTC i info True opts fname (infTerm lhs)))
1296+ return (res, probs))
1298+ when inf $ addTyInfConstraints (map (\(x,y,_,_) -> (x,y)) probs)
1291 let lhs_tm = orderPats (getInferTerm lhs')
1300 let lhs_tm = orderPats (getInferTerm lhs')
1292 let lhs_ty = getInferType lhs'
1301 let lhs_ty = getInferType lhs'
1293 logLvl 3 ("Elaborated: " ++ show lhs_tm)
1302 logLvl 3 ("Elaborated: " ++ show lhs_tm)
1294 logLvl 3 ("Elaborated type: " ++ show lhs_ty)
1303 logLvl 3 ("Elaborated type: " ++ show lhs_ty)
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
1296− (clhs_c, clhsty) <- recheckC fc [] lhs_tm
1308+ then recheckC fc [] lhs_tm
1309+ else return (lhs_tm, lhs_ty)
1297 let clhs = normalise ctxt [] clhs_c
1310 let clhs = normalise ctxt [] clhs_c
1299 logLvl 3 ("Normalised LHS: " ++ showTmImpls (delabMV i clhs))
1312 logLvl 3 ("Normalised LHS: " ++ showTmImpls (delabMV i clhs))
@@ -1328,7 +1341,7 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
1328 logLvl 2 $ "RHS: " ++ showTmImpls rhs
1341 logLvl 2 $ "RHS: " ++ showTmImpls rhs
1329 ctxt <- getContext -- new context with where block added
1342 ctxt <- getContext -- new context with where block added
1330 logLvl 5 "STARTING CHECK"
1343 logLvl 5 "STARTING CHECK"
1331− ((rhs', defer, is), _) <-
1344+ ((rhs', defer, is, probs), _) <-
1332 tclift $ elaborate ctxt (sMN 0 "patRHS") clhsty []
1345 tclift $ elaborate ctxt (sMN 0 "patRHS") clhsty []
1333 (do pbinds lhs_tm
1346 (do pbinds lhs_tm
1334 setNextName
1347 setNextName
@@ -1341,7 +1354,11 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
1341 mapM_ (elabCaseHole aux) hs
1354 mapM_ (elabCaseHole aux) hs
1342 tt <- get_term
1355 tt <- get_term
1343 let (tm, ds) = runState (collectDeferred (Just fname) tt) []
1356 let (tm, ds) = runState (collectDeferred (Just fname) tt) []
1344− return (tm, ds, is))
1358+ return (tm, ds, is, probs))
1360+ when inf $ addTyInfConstraints (map (\(x,y,_,_) -> (x,y)) probs)
1345 logLvl 5 "DONE CHECK"
1362 logLvl 5 "DONE CHECK"
1346 logLvl 2 $ "---> " ++ show rhs'
1363 logLvl 2 $ "---> " ++ show rhs'
1347 when (not (null defer)) $ iLOG $ "DEFERRED " ++ show (map fst defer)
1364 when (not (null defer)) $ iLOG $ "DEFERRED " ++ show (map fst defer)
@@ -1361,7 +1378,9 @@ elabClause info opts (cnum, PClause fc fname lhs_in withs rhs_in whereblock)
1361 ctxt <- getContext
1378 ctxt <- getContext
1362 logLvl 5 $ "Rechecking"
1379 logLvl 5 $ "Rechecking"
1363 logLvl 6 $ " ==> " ++ show (forget rhs')
1380 logLvl 6 $ " ==> " ++ show (forget rhs')
1381+ (crhs, crhsty) <- if not inf
1364− (crhs, crhsty) <- recheckC fc [] rhs'
1382+ then recheckC fc [] rhs'
1383+ else return (rhs', clhsty)
1365 logLvl 6 $ " ==> " ++ show crhsty ++ " against " ++ show clhsty
1384 logLvl 6 $ " ==> " ++ show crhsty ++ " against " ++ show clhsty
1366 case converts ctxt [] clhsty crhsty of
1385 case converts ctxt [] clhsty crhsty of
1367 OK _ -> return ()
1386 OK _ -> return ()